StreamCorruptedException:无效流 header
StreamCorruptedException: invalid stream header
我有一个 class 序列化程序
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();
}
}
我的客户端通过
发送数据
private static DataInputStream in;
private static DataOutput out;
...
out.writeInt(bytes.length);
out.write(bytes);
我是这样读的
int length = in.readInt();
if (length > 0) {
byte[] bytes = new byte[length];
in.readFully(bytes);
byte[] result = sp.processInput(bytes);
}
然后当我尝试反序列化我的 Person object(serializable) 时它抛出一个错误
Person person = (Person) Serializer.deserialize(bytes);
java.io.StreamCorruptedException: invalid stream header: 03ACED00
at model.Serializer.deserialize(Serializer.java:22)
人 class:
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;
我不能使用普通图像,因为它不可序列化,所以我想出了这个class。
SerializableImage class
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() {...}
首先我不能使用 ObjectInputStream,因为我的字节数组包含第一个字节,说明如何处理期望的 object。
当我发送字符串和其他核心 object 时一切正常。
能否指出我哪里出错了?
java.io.StreamCorruptedException: invalid stream header: 03ACED00
正确的流 header 应该是 ACED00..
。很明显,你有 03
字节从以前的反序列化中遗留下来。所以你在你的(未公开的)byte-array 阅读代码中有一个错误,顺便说一句,它应该看起来像这样:
int len = din.readInt();
byte[] data = new byte[len];
din.readFully(data);
等等
HOWEVER 根本没有理由在这里使用 ByteArrayInput/OutputStream
或 DataInput/OutputSream
。只需使用
new ObjectOutputStream(socket.getOutputStream())
和
new ObjectInputStream(socket.getInputStream())
其中这些在每个套接字的生命周期中分配一次,并直接使用 writeObject()
和 readObject()
。你这样做的方式没有任何优势,只是这样的错误的机会。
I cannot use ObjectInputStream in the first place because my byte array contains first byte saying what to do with the desirealized object.
这是不正确的。只需使用标记字节调用 write()
,然后调用 writeObject()
。在对端,调用read()
获取标签字节,然后readobject()
.
显然您在将第一个字节提供给 new ObjectInputStream(...)
之前删除第一个字节失败。
我有一个 class 序列化程序
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();
}
}
我的客户端通过
发送数据private static DataInputStream in;
private static DataOutput out;
...
out.writeInt(bytes.length);
out.write(bytes);
我是这样读的
int length = in.readInt();
if (length > 0) {
byte[] bytes = new byte[length];
in.readFully(bytes);
byte[] result = sp.processInput(bytes);
}
然后当我尝试反序列化我的 Person object(serializable) 时它抛出一个错误
Person person = (Person) Serializer.deserialize(bytes);
java.io.StreamCorruptedException: invalid stream header: 03ACED00
at model.Serializer.deserialize(Serializer.java:22)
人 class:
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;
我不能使用普通图像,因为它不可序列化,所以我想出了这个class。
SerializableImage class
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() {...}
首先我不能使用 ObjectInputStream,因为我的字节数组包含第一个字节,说明如何处理期望的 object。
当我发送字符串和其他核心 object 时一切正常。
能否指出我哪里出错了?
java.io.StreamCorruptedException: invalid stream header: 03ACED00
正确的流 header 应该是 ACED00..
。很明显,你有 03
字节从以前的反序列化中遗留下来。所以你在你的(未公开的)byte-array 阅读代码中有一个错误,顺便说一句,它应该看起来像这样:
int len = din.readInt();
byte[] data = new byte[len];
din.readFully(data);
等等
HOWEVER 根本没有理由在这里使用 ByteArrayInput/OutputStream
或 DataInput/OutputSream
。只需使用
new ObjectOutputStream(socket.getOutputStream())
和
new ObjectInputStream(socket.getInputStream())
其中这些在每个套接字的生命周期中分配一次,并直接使用 writeObject()
和 readObject()
。你这样做的方式没有任何优势,只是这样的错误的机会。
I cannot use ObjectInputStream in the first place because my byte array contains first byte saying what to do with the desirealized object.
这是不正确的。只需使用标记字节调用 write()
,然后调用 writeObject()
。在对端,调用read()
获取标签字节,然后readobject()
.
显然您在将第一个字节提供给 new ObjectInputStream(...)
之前删除第一个字节失败。