流损坏异常: 无效类型代码: AC

2022-09-01 02:23:45

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

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();
        }
    }
}

你是对的;我不关闭对象。我不知道该怎么做。


答案 1

潜在的问题是,您正在使用新的来写入在写入之前已经使用过的流。这些流具有由相应构造函数写入和读取的标头,因此,如果您创建另一个标头,则会编写一个新的标头,该标头以 - 猜猜是什么?- 并且现有的在这一点上不期望另一个标头,所以它barfs。ObjectOutputStreamObjectOutputStreamObjectOutputStream0xAC,ObjectInputStream

在@trashgod引用的Java论坛帖子中,我应该省略关于“两端的每个对象重新开始”的部分:这只是浪费。在套接字的生存期内使用单个 OOS 和 OIS,并且不要在套接字上使用任何其他流。

如果你想忘记你写的东西,使用ObjectOutputStream.reset().

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


答案 2