反序列化问题 – java.io.StreamCorruptedException:类型代码无效:00
我正在编写一个java文件传输应用程序,我有一些麻烦的反序列化自己定义的类来自Datagramms的消息。
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块)
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()
readObject().
您确定已收到序列化对象的所有字节吗? DatagramSocket使用UDP。 你确定所有的包都到了吗?
另外,使用UDP传输序列化对象真的是个好主意吗? 这是TCP似乎更加合理的一种情况。 UDP不保证交付或交付订单,这可能很容易导致流损坏。
你还应该真的把一个private static final long serialVersionUID = 1L;
在您的Message类上。
- 使用新的BufferedReader“java.io.IOException:Stream closed”
- 有效URL的java.io.FileNotFoundException
- java IOexception:Stream Closed
- Java编译器抱怨未报告的IOException
- 无法通过代理隧道。 代理返回HTTP / 1.1 503服务不可用
- IOexception – 读取结束死机 – 在此示例中导致它的原因以及如何修复它 – Java中的multithreading应用程序
- 使用Scanner读取输入会导致Java中的无限循环
- 从Java调用Python
- 使用lsof对“打开的文件太多”进行故障排除