【发布时间】:2015-11-30 16:43:23
【问题描述】:
我有一个类序列化器
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 对象(可序列化)时,它会抛出一个错误
Person person = (Person) Serializer.deserialize(bytes);
java.io.StreamCorruptedException: invalid stream header: 03ACED00
at model.Serializer.deserialize(Serializer.java:22)
人物类:
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;
我不能使用普通的图像,因为它不可序列化,所以我想出了这个类。
SerializableImage 类
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,因为我的字节数组包含第一个字节,说明如何处理所需的对象。
当我发送字符串和其他核心对象时,一切正常。
你能指出我哪里出错了吗?
【问题讨论】:
-
请展示一个简短但完整的程序,我们可以使用它来重现该问题。提示:问题很可能出在要么在序列化中或在传输中。您应该分别测试每个以找出它是什么,然后只在问题中包含相关的一个。
标签: java sockets serialization client