我的程序每秒大约100次更新存储在ArrayList中的数百个对象。我已经实现了Java内置的序列化,除非在对象进行时尝试序列化,否则它很有效。在这种情况下,我可能需要在它运行之前序列化六次(每次失败的尝试都会抛出一个例外)。我尝试将arraylist标记为瞬态,但是当我加载序列化文件时,抛出空指针异常。所以我尝试在no args构造函数中初始化瞬态arraylist,它没有任何帮助。我该怎么办?感谢。
答案 0 :(得分:3)
首先确保您已同步对ArrayList
的访问权限,例如初始化时:
List<String> list = Collections.synchronizedList(new ArrayList<String>());
当您需要序列化它时,请获取由于同步而保持一致的副本:
List<String> copy = new ArrayList<String>(list);
现在,您可以安全地序列化此副本,而不会阻止对主列表的访问。
答案 1 :(得分:0)
您无法使用foreach语句进行迭代并修改表格。
尝试使用
for (int i =0;i<arra.length;i++)
代替。
答案 2 :(得分:0)
将ArrayList
复制到新实例(带new ArrayList<>()
的浅层副本并序列化。
答案 3 :(得分:0)
如果您遍历集合并同时修改它,请使用Iterator。
答案 4 :(得分:0)
假设您确实不希望或不需要序列化的列表内容声明您的列表成员:
private transient final List<?> things = new ArrayList<Object>();
您将始终使用非空列表。
话虽如此,从声音来看,您对列表本身的更新可能需要考虑其他线程安全问题,如数据争用和可见性问题。