ArrayList的序列化并附加新的ArrayList

时间:2019-04-19 04:31:50

标签: java arraylist serialization append

我可以序列化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();
        }
    }

或者,我是否必须将新客户添加到现有客户的阵列列表中,并将更新后的阵列列表传递给序列化方法?每次添加新客户都可以重写新文件时,我想知道是否可以将新客户追加到现有文件中。

3 个答案:

答案 0 :(得分:0)

您必须将新客户添加到现有客户的阵列列表中,并将更新后的阵列列表传递给序列化方法。

答案 1 :(得分:0)

您应该将新客户添加到现有客户的数组列表中,并将其传递给您的方法

答案 2 :(得分:0)

起初

您不能使用不同的ObjectOutputStream将任何数据附加到文件中。您可以阅读这些Appending to an ObjectOutputStreamjava.io.StreamCorruptedException: invalid type code: AC的StackOverflow问题,以了解为什么不能这样做。简而言之,这是因为每个新的ObjectOutputStream都会将其标头附加到文件中,这将损坏它。因此,您应该使用单个ObjectOutputStream实例将所有对象写入文件。

第二

您无法序列化多个Customer对象,并将其反序列化为一个ArrayList<Customer>对象。因为不同对象的序列化数据相差很大。每个序列化数据都包含有关序列化对象类型,字段名称,字段类型等的元数据。 ObjectOutputStream以某种方式标记每个序列化对象的开始结束ObjectInputStream使用该标记来知道如何反序列化对象。这意味着,如果您要向ObjectOutputStream写2个对象,您的ObjectInputStream将清楚地读取这2个对象。

因此,如果要序列化多个Customer对象,然后将它们反序列化为一个ArrayList<Customer>,则应该实现自己的序列化/反序列化逻辑。

或者,您可以将新的Customer添加到ArrayList,然后擦除文件的所有内容,并将ArrayList序列化到该文件,但这会导致性能问题。