我有以下代码:
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 文件并反序列化
对象时,我得到了所有对象。但是,如果我将代码更改为:
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。任何人都可以解释这种行为吗?
最佳答案
当你将对象写入 ObjectOutputStream
两次时,第二次将只作为对原始数据的引用写入(“that ArrayList
with id x 我之前写的").
如果对象的内容已更改(就像您的情况一样),这种情况甚至都会发生,因此您将只有 1 个完整序列化(第一个)和 9 个引用第二种情况。
您可以调用ObjectOutputStream.reset()
丢弃先前写入的对象列表并强制其再次进行完整序列化。
关于java - 序列化中的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6134229/