StreamCorruptedException:无效的类型代码:AC

leb*_*lev 31 java streaming multithreading object

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

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)
Run Code Online (Sandbox Code Playgroud)

我第一次发送完全相同的对象消息; 但是,当我第二次尝试做同样的事情时,它会抛出上面的错误.我是否需要重新初始化readObject()方法?我甚至打印出下面一行正在接收的消息对象,它与第一个正常工作的实例相同.

Object buf = myInput.readObject();
Run Code Online (Sandbox Code Playgroud)

我假设附加有一些问题,但我真的没有用于追加.我只想每次都阅读一条新线.我非常感谢帮助修复这个bug.谢谢.

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

在那一行之前,我只是在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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

use*_*421 72

根本问题在于您使用new ObjectOutputStream来写入ObjectInputStream您在ObjectOutputStream写入之前已经使用过的现有内容.这些流有标题,由各自的构造函数编写和读取,所以如果你创建另一个,ObjectOutputStream你会写一个新的标题,开头 - 猜猜是什么?- 0xAC,并且现有ObjectInputStream的并不期望另一个标题,所以它barfs.

在@trashgod引用的Java论坛主题中,我应该省略关于'两端每个对象重新'的部分:这只是浪费.在套接字的生命周期中使用单个OOS和OIS,并且不要在套接字上使用任何其他流.

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

并且不要使用任何其他流ReadersWriters在同一个套接字上.对象流API可以处理所有Java原始数据类型和所有Serializable类.

  • +1 @rookie:这是正确答案,来自原始来源!:-) (2认同)
  • @AndroidOptimist 什么代码?我还没有发布任何代码。这个答案的本质是“删除”代码。 (2认同)