序列化中的不同行为

时间:2011-05-26 05:49:57

标签: 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(list);
}
oo.close();

当我打开test.dat文件和unserialize对象时,我得到了所有对象。但是,如果我将代码更改为:

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();

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

2 个答案:

答案 0 :(得分:5)

当您将对象写入ObjectOutputStream两次时,第二次只会被写为对原始数据的引用(“ArrayList {id x 我之前写的“)。

如果对象的内容发生了变化(就像在你的情况下那样),会发生甚至,因此你只有1个完整的序列化(第一个)和9个引用第二种情况。

可以调用ObjectOutputStream.reset()来丢弃先前写入的对象列表并强制它再次进行完整序列化。

答案 1 :(得分:0)

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