我有以下代码:
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。有人可以解释一下这种行为吗?
答案 0 :(得分:5)
当您将对象写入ObjectOutputStream
两次时,第二次只会被写为对原始数据的引用(“ArrayList
{id x 我之前写的“)。
如果对象的内容发生了变化(就像在你的情况下那样),会发生甚至,因此你只有1个完整的序列化(第一个)和9个引用第二种情况。
你可以调用ObjectOutputStream.reset()
来丢弃先前写入的对象列表并强制它再次进行完整序列化。
答案 1 :(得分:0)
这是因为在一种情况下,您使用的是10个对象实例,而在另一种情况下,您使用的是1个实例。您的oo
只知道要保留的对象的1个实例。