java - 反序列化问题 - java.io.StreamCorruptedException : invalid type code: 00

标签 java serialization deserialization ioexception corruption

我正在编写一个java文件传输应用程序,并且我在反序列化来自数据报的我自己定义的类消息时遇到了一些麻烦。

StackOverflow 上的其他主题也有类似的问题,但我没有从中找到有用的内容,所以如果我错过了,我提前表示抱歉。

所以,消息类是:

import java.io.Serializable;

public class Message implements Serializable {

    private static final long serialVersionUID = 1L;

    private int segmentID;
    private byte[] packet;
    private int bytesToWrite;

    public Message(){
        segmentID = -1;
    }

    public Message(int segmentID, byte[] packet, int bytesToWrite) {
        this.segmentID = segmentID;
        this.packet = packet;
        this.bytesToWrite = bytesToWrite;
    }

    public int getBytesToWrite() {
        return bytesToWrite;
    }

    public int getSegmentID() {
        return segmentID;
    }

    public byte[] getPacket() {
        return packet;
    }
}

没什么特别的。 我用

序列化它
public byte[] serialize(Message obj) throws IOException
{
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
    objectStream.flush();
    objectStream.writeObject(obj);
    objectStream.flush();
    return byteStream.toByteArray();
}

实际上,通过数据报发送

msg = new byte[512];
int bytesRead;
bytesRead = fileReader.read(msg);//fileReader is FileInputStream
Message message = new Message(segmentID, msg, bytesRead);
byte[] test = serialize(message);
datagramSocket.send(new DatagramPacket(test, test.length, 
    datagramSocket.getInetAddress(), datagramSocket.getPort()));

我从其他地方收到的

byte[] buffer = new byte[8192];
DatagramPacket receivedPacket = new DatagramPacket(buffer, buffer.length);
socket.recieve(recievedPacket); //it's already connected by init packet
receiveMSG = (Message) deserialize(receivedPacket.getData(), 
    receivedPacket.getOffset(), receivedPacket.getLength());

where(这里删除try/catch block )

private Object deserialize(byte[] bytes, int offset, int length)
{
    ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes, offset, length);
    ObjectInputStream objectStream = new ObjectInputStream(new BufferedInputStream(byteStream));
    Object tmpMsg = new Object();
        tmpMsg = objectStream.readObject();//here catches the EOFException
    return tmpMsg;
}

为什么会这样?我按照 http://goo.gl/Rq1rMm 的说明进行操作
我在哪里做错了什么? 我检查了初始消息是否通过(我有它们,但这里只是我的一小部分代码)并且接收中的数据报不为空。此外,发送和接收的数据报具有相同的长度。 提前致谢。

最佳答案

receiveMSG = (Message) deserialize(receivedPacket.getData());

您需要将其更改为

receiveMSG = (Message) deserialize(receivedPacket.getData(), receivedPacket.getOffset(), receivedPacket.getLength);

并相应地调整“deserialise()”方法,以接受“offset”和“length”参数,并在构造 ByteArrayInputStream 时使用它们。

编辑您发布的代码无法编译:构造传出数据报包的表达式不正确。应该是

new DatagramPacket(test, test.length, datagramSocket.getInetAddress(), datagramSocket.getPort())

我不知道 packetOverhead 应该是什么,但你不需要它。

注意,在调用 readObject() 之前,您不需要创建 new Message() 行。

关于java - 反序列化问题 - java.io.StreamCorruptedException : invalid type code: 00,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23351748/

相关文章:

debugging - 有没有办法在 Debug模式下序列化对象?

java - 生成的子类结果反序列化到父对象中

java - 反序列化嵌套 Json 数组

c# - 使用restsharp反序列化 - 我尝试了文档,但它不起作用

java - 应用程序因空指针异常而崩溃,并且在 android webview 中按下“返回”时出现其他错误

java - Spring MongoTemplate - 将聚合结果映射到集合(例如 List 和 Map)

jquery - 如何将多维数组序列化为字符串以及相反?

perl - 在数据库上存储对象并检索它

java - 在Java中递归地替换链表中的字符串

java - H2嵌入式数据库的模式相关问题