java - StreamCorruptedException : invalid stream header

标签 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.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;

我不能使用普通图像,因为它不可序列化,所以我想出了这个类。

SerializedImage类

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

正确的流 header 应该是ACED00..。很明显,您有先前反序列化留下的 03 字节。所以你的(未公开的)字节数组读取代码中有一个错误,顺便说一句,它应该看起来像这样:

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

等等

但是这里根本没有理由使用ByteArrayInput/OutputStreamDataInput/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(...) 之前,您未能删除它。

关于java - StreamCorruptedException : invalid stream header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34003591/

相关文章:

java - 如何声明一个抽象方法,使参数类型(类)始终是Children类?

java - jsp中自动补全文本框

python - 如何清空python中的套接字?

java - 二进制序列化协议(protocol)

ruby-on-rails - week_field 在序列化和反序列化后给出错误的周

Java 深度克隆对象

Java HotSpot(TM) 64 位服务器虚拟机警告

java - 集群 Quartz 调度器配置

java - 如何从服务器套接字读取unicode字符

python - 在 Python 中接收图像