我正在编写一个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/