Java 序列化中的不同行为

Java 序列化中的不同行为,java,serialization,Java,Serialization,我有以下代码: ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("test.dat")); ArrayList<String> list = null; for(int i = 0; i < 10; i++) { list = new ArrayList<String>(); list.add("Object" + i); oo.writeObject(l

我有以下代码:

ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("test.dat"));
ArrayList<String> list = null;
for(int i = 0; i < 10; i++)
{
    list = new ArrayList<String>();
    list.add("Object" + i);
    oo.writeObject(list);
}
oo.close();

现在,当我读取对象时,我只得到第一个对象,即Object0。有人能解释一下这种行为吗?

这是因为在一种情况下,您使用的是10个对象实例,而在另一种情况下,您使用的是1个实例。您的
oo
只知道要持久化的对象的一个实例

当您将一个对象写入
ObjectOutputStream
两次时,第二次将作为对原始数据的引用写入(“该
ArrayList
,id为x,我以前写过”)

如果对象的内容发生了更改(在您的情况下也是如此),则会发生这种情况,因此在第二种情况下,只有1个完整序列化(第一个)和9个引用


您可以调用以放弃以前编写的对象列表,并强制它再次执行完整的序列化。

Great post!我以前不知道。感谢您提高了我的序列化知识。
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("test.dat"));
ArrayList<String> list = new ArrayList<String>();
for(int i = 0; i < 10; i++)
{
    list.clear(); //clear the earlier objects
    list.add("Object" + i);
    oo.writeObject(list);
}
oo.close();