【问题标题】:Corrupted ObjectOutputStream for a socket [duplicate]套接字的损坏的 ObjectOutputStream [重复]
【发布时间】:2012-05-06 00:01:58
【问题描述】:

我试图通过单个发送多个不同类的可序列化对象

ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());

但是,我总是得到一个

java.io.StreamCorruptedException:无效类型代码:AC

我已经浏览过论坛并尝试过out.reset(),但它似乎不起作用。 我做错了什么或遗漏了什么?

请帮忙

【问题讨论】:

  • 发布您推送到该流中的所有内容的确切代码,以及试图在另一端从中读取的代码。毕竟,这是读者方面的错误。

标签: java sockets serializable


【解决方案1】:

损坏的是流,而不是ObjectOutputStream。那是一个类的名称。

当您尝试使用单个ObjectInputStream 读取多个ObjectOutputStreams 的结果时会出现此问题。这是无效的。 ObjectOutputStream 写了一个以 - 开头的标题 - 你猜怎么着? 0xAC。因此,当您使用单个 ObjectInputStream 读取由多个 ObjectOutputStreams 创建的流时,它会发现意外的 0xAC 并抛出该异常。

解决方案:不要那样做。您不能将多个ObjectOutputStreams 附加到一个文件中,也不能在一个套接字上使用多个ObjectOutputStreams,除非您有足够的协调能力在流中的精确点创建一个新的ObjectInputStream最后一个ObjectOutputStream 离开了:相反,您必须在套接字的生命周期内使用相同的ObjectInputStreamObjectOutputStream

【讨论】:

    【解决方案2】:

    您很可能错误地使用了 ObjectOutputStream 或 ObjectInputStream。

    常见的错误包括

    • 在同一底层流上使用多个对象流。只用一个。
    • 使用 Object Stream 和另一个流包装器,如 Writer/Reader 或 DataInput/OutputStream。

    顺便说一句:您应该始终先创建 ObjectOutputStream 并在使用 ObjectInputStream 之前对其进行 flush()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多