当前位置: 首页 > 面试题库 >

StreamCorruptedException:无效的类型代码:AC

柴文林
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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

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



 类似资料:
  • 我试图发送对象从服务器模块到客户端模块。不幸的是,它抛出错误。有人知道下面的代码有什么问题吗? 来自服务器模块的类 客户端模块中的类看起来相同,但看起来如下所示: 最后一个类,它接受套接字连接:

  • 问题内容: 读取序列化对象时出现错误(java.io.StreamCorruptedException:无效类型代码:00)。这是实现可序列化的类: 这是堆栈跟踪: 有谁知道我如何获得有关该错误的更多信息?还是Java期望哪个对象? 问题答案: 您已经实现了一种递归方法:将实例写入输出流时,它会调用writeObject方法,该方法将写入一个int,然后将该对象写入输出流,再写入一个int,依此类

  • 我正在尝试开发一个Java客户机-服务器应用程序,其中多个客户机可以连接到服务器。我为每个传入的客户机启动一个单独的线程,将客户机套接字传递给该线程,然后打开一对流来维护通信。我得到了这个java。伊奥。StreamCorruptedException-无效的代码类型AC。 根据我的研究,这意味着我使用一个新的ObjectOutputStream来写入现有的ObjectInputStream。然而

  • 我的Android Studio工作正常,但在更新插件后,我得到以下错误。我尝试更新JDK并重新安装Android Studio,但仍然面临同样的错误。 这是同步选项卡错误。 这是构建选项卡错误

  • 问题内容: 大多数Java代码也是语法上有效的Groovy代码。但是,有一些例外使我想到了这个问题: 在Groovy中,Java中哪些构造/功能在语法上无效? 请提供无效的Groovy代码(Groovy 1.6)的Java代码(Java 1.6)的具体示例。 更新: 到目前为止,我们有五个语法上有效的Java代码示例,它们不是有效的Groovy代码: 数组初始化 内部班 是Groovy中的关键字,

  • 问题内容: 我想问问哪段代码在Java中更有效?代码1: 代码2: 我的老师说第二个更好,但我不同意这种观点。 问题答案: 我更喜欢第一个而不是第二个,因为它使循环变量不会影响方法中其余代码。由于它们在循环外部不可见,因此以后不能无意间引用它们。 其他答案也是正确的: 不要 担心这种性能问题。但是,出于代码可读性的原因,并且为了与下一个出现的人交流程序员的意图, 请 考虑一下。这比微优化问题重要得