StreamCorruptedException: invalid stream header
Habe ich eine Klasse Serializer
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();
}
}
Mein client sendet Daten über
private static DataInputStream in;
private static DataOutput out;
...
out.writeInt(bytes.length);
out.write(bytes);
Lese ich es auf diese Weise
int length = in.readInt();
if (length > 0) {
byte[] bytes = new byte[length];
in.readFully(bytes);
byte[] result = sp.processInput(bytes);
}
Dann, wenn ich versuche zu Deserialisieren meine Person-Objekt(serializable) wirft er mir eine Fehlermeldung
Person person = (Person) Serializer.deserialize(bytes);
java.io.StreamCorruptedException: invalid stream header: 03ACED00
at model.Serializer.deserialize(Serializer.java:22)
Person-Klasse:
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;
Kann ich nicht mit einem normalen Bild, denn es ist nicht serialisierbar, so kam ich mit dieser Klasse.
SerializableImage Klasse
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() {...}
Kann ich nicht verwenden ObjectInputStream in Erster Linie, weil mein byte-array enthält das erste byte, der sagt, was zu tun mit der desirealized Objekt.
Alles war okey, wenn ich geschickt, Streichern und anderen core-Objekte.
Können Sie bitte zeigen, wo ich den Fehler haben?
- Bitte zeigen Sie ein kurzes, aber komplettes Programm, das wir verwenden können, um das Problem zu reproduzieren. Hinweis: das problem ist wahrscheinlich entweder in der Serialisierung oder in der übertragung. Sollten Sie testen, jede einzeln für sich herausfinden, welche es ist, und dann nur die relevanten einer in Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen korrekten stream-header wäre
ACED00..
. So deutlich haben Sie die03
byte übrig von einem früheren Deserialisierung. So haben Sie einen Fehler in Ihrem (geheimen) byte-array-code Lesen, der BTW soll so ausgesehen haben:etc.
JEDOCH Es gibt keinen Grund für die Verwendung
ByteArrayInput/OutputStream
oderDataInput/OutputSream
hier überhaupt. Verwenden Sie einfachund
denen diese zugeordnet sind, einmal für die Lebensdauer von jeder Steckdose, und verwenden Sie
writeObject()
undreadObject()
direkt. Es gibt keinen Vorteil, um die Art und Weise Sie es tun, nur Möglichkeiten für Fehler wie diese.Nicht richtig. Rufen Sie einfach
write()
mit dem tag byte, dannwriteObject()
. Bei der peer, rufen Sieread()
um die tag-byte, dannreadobject()
.Offenbar haben Sie versagt entfernen des ersten byte, bevor es zu
new ObjectInputStream(...)
.