Percy

StreamCorruptedException:无效的类型代码:AC

java

我的问题是,当它尝试第二次读取对象时,会引发异常:

java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at Client.run(BaseStaInstance.java:313)

java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at Client.run(BaseStaInstance.java:313)

我第一次发送完全相同的对象消息;但是,当我第二次尝试执行相同的操作时,则会在上面抛出错误。我是否需要重新初始化readObject()方法?我什至打印出了下面一行所接收到的消息对象,它与第一个可以正常工作的实例完全相同。

Object buf = myInput.readObject();
我假设附加有一些问题,但是附加确实没有用。我只想每次都读一遍新书。我非常感谢您提供一些修复此错误的帮助。谢谢。

=================================

在那一行之前,我只是在run()方法中为套接字创建输入和输出对象。对象声明在类的run()方法之外:

@Override
public void run() {
    try {
        sleep((int) 1 * 8000);
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        //Creating input and output streams to transfer messages to the server
        myOutput = new ObjectOutputStream(skt.getOutputStream());
        myInput = new ObjectInputStream(skt.getInputStream());
        while (true) {
            buf = myInput.readObject();
        }
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

你是对的; 我没有关闭物体。我不确定该怎么做。


阅读 356

收藏
2020-12-03

共1个答案

一尘不染

潜在的问题是,您正在使用newObjectOutputStream来写入已使用过before的流ObjectOutputStream。这些流具有由各自的构造函数编写和读取的标头,因此,如果创建另一个ObjectOutputStream标头,则将编写一个新的标头,以-猜猜是什么?-0xAC,并且现有的ObjectInputStream对象此时不希望有其他标头,因此会阻塞。

在@trashgod引用的Java Forums线程中,我应该省略有关“两端的每个对象都重新创建”的部分:这只是浪费。在套接字的整个生命周期内使用一个OOS和OIS,并且不要在套接字上使用任何其他流。

如果您想忘记自己写的东西,请使用 ObjectOutputStream.reset().

并且不要使用任何其他流Readers或Writers在同一套接字上。对象流API可以处理所有Java基本数据类型和所有Serializable类。

2020-12-03