Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反序列化问题-java.io.StreamCorruptedException:无效类型代码:00_Java_Serialization_Deserialization_Ioexception_Corruption - Fatal编程技术网

反序列化问题-java.io.StreamCorruptedException:无效类型代码:00

反序列化问题-java.io.StreamCorruptedException:无效类型代码:00,java,serialization,deserialization,ioexception,corruption,Java,Serialization,Deserialization,Ioexception,Corruption,我正在编写一个java文件传输应用程序,对数据语法中自己定义的类消息进行反序列化时遇到了一些问题 StackOverflow的其他主题也有类似的问题,但我没有从中找到有用的东西,所以如果我错过了,我很抱歉 因此,类消息是: import java.io.Serializable; public class Message implements Serializable { private static final long serialVersionUID = 1L; pr

我正在编写一个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());
其中(此处删除try/catch块)

为什么会这样?我是按照
我哪里做错了,哪里做错了? 我检查了初始消息是否通过(我有它们,但这里只是我代码的一小部分),并且receive中的数据报不为null。此外,发送和接收的数据报具有相同的长度。
提前感谢。

您确定已收到序列化对象的所有字节吗?DatagramSocket在引擎盖下使用UDP。你确定所有的包裹都到了吗

另外,使用UDP传输序列化对象真的是个好主意吗?在这种情况下,TCP似乎更合适。UDP不保证传递或传递顺序,这很容易导致流损坏

您还应该将
私有静态final long serialVersionUID=1L

receiveMSG=(消息)反序列化(receivedPacket.getData())

您需要将此更改为

receiveMSG = (Message) deserialize(receivedPacket.getData(), receivedPacket.getOffset(), receivedPacket.getLength);
并相应地调整“反序列化()”方法,以接受“偏移量”和“长度”参数,并在构造ByteArrayInputStream时使用它们

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

new DatagramPacket(test, test.length, datagramSocket.getInetAddress(), datagramSocket.getPort())
我不知道packetOverhead应该是什么,但你不需要它


注意:在调用
readObject()之前,您不需要创建
新消息()
行。

您应该放置一个
私有静态final long serialVersionUID=1L在你的消息类上。嗯,我发送了一个数据包,它已经“损坏”。。。谢谢,我将尝试UDP-我必须使用它,这是一种任务哦,我只是尝试在一个块中序列化和反序列化消息,并将结果与源代码进行比较。。。这是不相等的,所以我认为这是func“反序列化()”中的一些错误代码。没有UDP连接。这就是进步。现在,这意味着您正试图读取一个不存在的对象,或者您的接收字节数组太小。跟踪传出和传入的长度。您当然应该将512增加到至少534。在TCP/IP RFC中的某个地方,神奇的数字576显示为阈值,低于该阈值,路由器可能不会对IP数据包进行分段。除去开销和一些错误因素,534通常被认为是互联网上UDP的最大可能数据报大小。如果发送方和接收方在同一LAN段中运行,那么如果两端的套接字发送和接收缓冲区以及应用程序缓冲区(如byte[]数组)足够大,则至少可以达到8192。您发送的消息是序列化流。它包含超过12个字节的内容,您刚刚证明了这一点。如果发送方需要641字节,则接收方需要641字节。我会将接收缓冲区更改为至少8192。另请参见上面我的编辑。该代码仍然无法编译新数据包(消息,…)不存在。第一个参数是“byte[]”。请参阅上面我的编辑。这也不会编译。我想看看你的实际代码,编辑成你的问题。复制和粘贴。不是你想的那样。如果你在这里的每件事都是对的,你就不会有问题,也不会问问题。
new DatagramPacket(test, test.length, datagramSocket.getInetAddress(), datagramSocket.getPort())