我可以序列化ArrayList进行第一次运行。在创建data.ser
文件时,它第一次存储客户arraylist。其他时候它不追加新的ArrayList客户。
public void serializeBank(ArrayList<Customer> newCustomers) {
try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("data.ser", true))) {
os.writeObject(newCustomers);
} catch (IOException i) {
i.getMessage();
}
}
或者,我是否必须将新客户添加到现有客户的阵列列表中,并将更新后的阵列列表传递给序列化方法?每次添加新客户都可以重写新文件时,我想知道是否可以将新客户追加到现有文件中。
答案 0 :(得分:0)
您必须将新客户添加到现有客户的阵列列表中,并将更新后的阵列列表传递给序列化方法。
答案 1 :(得分:0)
您应该将新客户添加到现有客户的数组列表中,并将其传递给您的方法
答案 2 :(得分:0)
起初
您不能使用不同的ObjectOutputStream
将任何数据附加到文件中。您可以阅读这些Appending to an ObjectOutputStream和java.io.StreamCorruptedException: invalid type code: AC的StackOverflow问题,以了解为什么不能这样做。简而言之,这是因为每个新的ObjectOutputStream
都会将其标头附加到文件中,这将损坏它。因此,您应该使用单个ObjectOutputStream
实例将所有对象写入文件。
第二
您无法序列化多个Customer
对象,并将其反序列化为一个ArrayList<Customer>
对象。因为不同对象的序列化数据相差很大。每个序列化数据都包含有关序列化对象类型,字段名称,字段类型等的元数据。 ObjectOutputStream
以某种方式标记每个序列化对象的开始和结束,ObjectInputStream
使用该标记来知道如何反序列化对象。这意味着,如果您要向ObjectOutputStream
写2个对象,您的ObjectInputStream
将清楚地读取这2个对象。
因此,如果要序列化多个Customer
对象,然后将它们反序列化为一个ArrayList<Customer>
,则应该实现自己的序列化/反序列化逻辑。
或者,您可以将新的Customer
添加到ArrayList
,然后擦除文件的所有内容,并将ArrayList
序列化到该文件,但这会导致性能问题。