Java StreamCorruptedException:流标头无效

Java StreamCorruptedException:流标头无效,java,sockets,serialization,client,Java,Sockets,Serialization,Client,我有一个类序列化程序 public class Serializer { private Serializer() {} public static byte[] serialize(Object obj) throws IOException { ByteArrayOutputStream b = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(b); out.

我有一个类序列化程序

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.io.StreamCorruptedException: invalid stream header: 03ACED00
正确的流标题应该是
ACED00..
。因此,很明显,您有先前反序列化留下的
03
字节。因此,在(未公开的)字节数组读取代码中有一个bug,顺便说一句,应该是这样的:

int len = din.readInt();
byte[] data = new byte[len];
din.readFully(data);
等等

但是这里根本没有理由使用
ByteArrayInput/OutputStream
DataInput/OutputSream
。只用

new ObjectOutputStream(socket.getOutputStream())

在每个套接字的生存期内分配一次,并直接使用
writeObject()
readObject()
。你这样做没有什么好处,只有这样的机会

我不能首先使用ObjectInputStream,因为我的字节数组包含第一个字节,说明如何处理所需的对象

那是不对的。只需使用标记字节调用
write()
,然后
writeObject()
。在对等端,调用
read()
获取标记字节,然后调用
readobject()

显然,在将第一个字节提供给
新ObjectInputStream(…)
之前,您没有删除它。请显示一个简短但完整的程序,我们可以使用它来重现该问题。提示:问题可能在序列化或传输中。你应该分别测试每一个,找出它是什么,然后在问题中只测试相关的一个。
new ObjectInputStream(socket.getInputStream())