【发布时间】:2015-08-13 04:50:04
【问题描述】:
我想将一个简单的 Person 类(带有姓名和年龄)序列化到一个名为“somepersons.ser”的文件中。基本上我想实现以下代码的行为:
Person p1 = new Person("Person1", 45);
Person p2 = new Person("Person2", 35);
FileOutputStream fos = new FileOutputStream("somepersons.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p1);
oos.writeObject(p2);
oos.close();
FileInputStream fis = new FileInputStream("somepersons.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
p1 = (Person)ois.readObject();
p2 = (Person)ois.readObject();
System.out.println(p1);
System.out.println(p2);
此代码将两个 Person 存储在一个文件中,然后将它们恢复并显示在屏幕上。这按预期工作。
我的问题是:我想将存储 Person 的代码放在一个单独的方法中,因此您可以使用文件路径名和要序列化的 Person 作为参数调用该方法,然后该方法序列化传递的人到文件中。基本上我希望代码能够做这样的事情:
Person p1 = new Person("Person1", 45);
Person p2 = new Person("Person2", 35);
FileOutputStream fos = new FileOutputStream("somepersons.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p1);
oos.close();
FileOutputStream fos2 = new FileOutputStream("somepersons.ser");
ObjectOutputStream oos2 = new ObjectOutputStream(fos2);
oos2.writeObject(p2);
oos2.close();
FileInputStream fis = new FileInputStream("somepersons.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
p1 = (Persona)ois.readObject();
p2 = (Persona)ois.readObject();
System.out.println(p1);
System.out.println(p2);
第二段代码尝试与第一段代码相同,但不依赖已创建的 FileOutputStream 及其对应的 ObjectOutputStream 的存在。 但是当我第二次尝试在 ObjectInputStream ois 上调用 readObject 时,它会引发 EOFException,因为只有一个对象已被序列化(第二个 Person)。我尝试过刷新、重置等,但我得到了一个不同的异常,但它总是失败。 我怀疑在这段代码中存在一些我不太理解的重要序列化概念,我希望有人能帮我解释一下。我见过类似的问题,但答案似乎不适合我的问题。如果我不想同时序列化所有对象,如何实现第一段代码的行为?更重要的是(提高我对序列化的理解),为什么这不起作用? 谢谢!
【问题讨论】:
-
对象序列化对于对象的长期存储来说是一个糟糕的选择,考虑使用更像JAXB 的东西。提示
FileOutputStream(File, boolean) -
你考虑过写两个文件吗?
标签: java serialization fileoutputstream objectinputstream objectoutputstream