StreamCorruptedException: invalid stream en-tête
J'ai une classe de Sérialiseur
public class Serializer {
private Serializer() {}
public static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(b);
out.writeObject(obj);
return b.toByteArray();
}
public static Object deserialize(byte [] bytes) throws IOException, ClassNotFoundException {
if (bytes == null) return null;
ByteArrayInputStream b = new ByteArrayInputStream(bytes);
ObjectInputStream in = new ObjectInputStream(b);
return in.readObject();
}
}
Mon client envoie des données via
private static DataInputStream in;
private static DataOutput out;
...
out.writeInt(bytes.length);
out.write(bytes);
J'ai lu de cette façon
int length = in.readInt();
if (length > 0) {
byte[] bytes = new byte[length];
in.readFully(bytes);
byte[] result = sp.processInput(bytes);
}
Et puis quand j'essaie de désérialiser mon objet Personne(serializable) il me lance une erreur
Person person = (Person) Serializer.deserialize(bytes);
java.io.StreamCorruptedException: invalid stream header: 03ACED00
at model.Serializer.deserialize(Serializer.java:22)
Classe personne:
public class Person implements Serializable {
private String creationDate;
private String name;
private String birthDate;
private String city;
private String phoneNumber;
private String email;
private String university;
private String place;
private String reason;
private SerializableImage photo;
private boolean attended;
Je ne peux pas utiliser d'image ordinaire, car il n'est pas sérialisable, alors je suis venu avec cette classe.
SerializableImage classe
public class SerializableImage implements Serializable {
private int width, height;
private int[][] data;
public SerializableImage(Image image) {
setImage(image);
}
public void setImage(Image image){...}
public Image getImage() {...}
Je ne peux pas utiliser ObjectInputStream, en premier lieu, parce que mon tableau d'octets contient le premier octet dire quoi faire avec le desirealized objet.
Tout est okey quand j'ai envoyé les chaînes et autres objets du noyau.
Pouvez vous s'il vous plaît point où j'ai l'erreur?
- S'il vous plaît montrer une courte mais complète du programme, nous pouvons utiliser ou de reproduire le problème. Astuce: le problème est susceptible d'être soit dans la sérialisation ou dans la transmission. Vous devez tester chaque séparément pour travailler sur qui il est, et ensuite seulement la pertinence de la question.
Vous devez vous connecter pour publier un commentaire.
Un bon flux de l'en-tête serait
ACED00..
. Donc clairement, vous avez la03
octet de gauche au cours d'un précédent de la désérialisation. Si vous avez un bug dans votre (non divulgué) tableau d'octets lecture de code, qui BTW devrait ressembler à ceci:etc.
CEPENDANT Il n'y a pas de raison d'utiliser
ByteArrayInput/OutputStream
ouDataInput/OutputSream
ici à tous. Utilisez simplementet
où ils sont affectés une fois pour la durée de vie de chaque prise, et l'utilisation
writeObject()
etreadObject()
directement. Il n'y a aucun avantage à la façon dont vous le faites, juste des opportunités pour les bugs de ce genre.Ce n'est pas correct. Appelez simplement
write()
avec le tag octet, puiswriteObject()
. Au pair, appelread()
pour obtenir la balise octet, puisreadobject()
.Évidemment vous avez pas réussi à supprimer le premier octet avant de la fournir à
new ObjectInputStream(...)
.