2009-10-22 72 views
1

是否有可能ObjectOutputStream/ObjectInputStream是一个内部类?我可以编写它,然后检查创建的文件,但是当我尝试使用ObjectInputStream读取它时,我只是试图读取Object的一个EOFException o = oos.readObject();java-IO在内部类

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

我必须继续前进,并创建一个常规类,并在发送者类中实例化,但我讨厌走开不知道它是否可能,如果不是的话。

更新:是那样的问题的原因的相关问题:

答:您不能重新打开与ObjectOutputStream写入一个文件,追加:第二个标题写入和损坏文件。

B.使用ByteOutputStream序列化HashMap来完成散列摘要不起作用,因为当您从ObjectOutputStream文件中读回HashMap时,您可能会从ByteOutputStream中获取不同的byte [],因为对顺序:内容相同,但字节[](以及散列消解)不是。

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

+1

你是什么意思的内部类? (如果你的意思是内心阶层,那么是的,你可以连载他们,但规范告诉你不要这样做。) – 2009-10-22 20:12:47

+0

你能提供任何细节 - 在哪里,为什么? 谢谢。 – cvsdave 2009-10-28 11:18:28

回答

2

这一个适用于我。请查找您的解决方案的任何差异。

 
public class Example implements Serializable { 
    public static void main(String[] args) throws IOException, ClassNotFoundException { 
     new Example().run(); 
    } 

    private void run() throws IOException, ClassNotFoundException { 
     Inner inner = new Inner(); 
     inner.x = 5; 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     ObjectOutputStream outputStream = new ObjectOutputStream(out); 
     outputStream.writeObject(inner); 

     ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); 
     ObjectInputStream inputStream = new ObjectInputStream(in); 
     Inner inner2 = (Inner) inputStream.readObject(); 

     System.out.println(inner2.x); 
    } 

    class Inner implements Serializable { 
     int x; 
    } 
} 

+0

谢谢 - 我的问题是“是否有可能” - 答案显然是肯定的。你有什么关于Tom Hawlin关于规范的评论说不要序列化内部类吗? – cvsdave 2009-10-28 11:17:04

2

您可以包含一小段示例代码吗?最明显的解释是,在您尝试读取输出流之前,您没有关闭/清除输出流。

+0

输出流已关闭。该代码位于封闭网络机器上,因此可以进行转录,但代码并不简单。我不清楚为什么不关闭流将适用于此 - 如果流不关闭,问题也会显示何时使用外部类,不是吗? – cvsdave 2009-10-28 11:14:42