【问题标题】:java - IO on internal classjava - 内部类的 IO
【发布时间】:2010-12-09 05:39:03
【问题描述】:

是否可以将 ObjectOutputStream/ObjectInputStream 设为内部类?我可以写好,并检查创建的文件,但是当我尝试使用 ObjectInputStream 读回它时,我得到一个 EOFException,只是试图读取一个 Object o = oos.readObject();

  1. 我使用同一个 File 对象打开两个流,所以这不是问题。
  2. 它似乎与内部类的性质无关 - 只有一个公共 int 的类与更复杂的类一样失败。

我必须继续前进,创建一个常规类,并在发送者类中实例化,但我讨厌在不知道这是否可能的情况下走开,如果不知道为什么不这样做。

更新:导致问题的相关问题:

A.您无法重新打开使用 ObjectOutputStream 写入的文件并追加:写入第二个标头并损坏文件。

B.使用 ByteOutputStream 序列化 HashMap 以执行哈希摘要是行不通的,因为当您从 ObjectOutputStream 文件中读回 HashMap 时,您很可能会从 ByteOutputStream 获得不同的 byte[],因为成对顺序的变化:内容是相同,但 byte[](以及哈希摘要)不是。

希望这可以帮助某人节省一些时间。

【问题讨论】:

  • 内部类是什么意思? (如果你的意思是内部类,那么是的,你可以将它们序列化,但规范告诉你不要这样做。)
  • 你能提供任何细节吗?在哪里,为什么?谢谢。

标签: java io objectinputstream eofexception


【解决方案1】:

这个对我有用。请寻找与您的解决方案的任何差异。

公共类示例实现可序列化{ public static void main(String[] args) 抛出 IOException,ClassNotFoundException { 新的示例()。运行(); } private void run() 抛出 IOException,ClassNotFoundException { 内内 = new Inner(); 内部.x = 5; ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(out); outputStream.writeObject( 内部 ); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ObjectInputStream inputStream = new ObjectInputStream( in ); 内部 inner2 = (Inner) inputStream.readObject(); System.out.println(inner2.x); } 类内部实现可序列化{ 诠释 x; } }

【讨论】:

  • 谢谢——我的问题是“有可能吗”——答案显然是肯定的。您对 Tom Hawlin 对规范说不要序列化内部类的评论有什么看法吗?
【解决方案2】:

您能否包含一些示例代码?最明显的解释是,在尝试重新读取输出流之前,您没有关闭/刷新输出流。

【讨论】:

  • 输出流已关闭。该代码位于封闭网络机器上,因此可以转录,但该代码并不简单。我不清楚为什么不关闭流在这里适用 - 如果流没有关闭,问题也会在使用外部类时出现,不是吗?
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 2023-01-24
  • 2017-05-09
  • 2018-03-08
  • 1970-01-01
  • 2011-02-17
  • 2012-08-17
相关资源
最近更新 更多