簡體   English   中英

ArrayList的序列化和附加新的ArrayList

[英]Serialization of ArrayList and appending new ArrayList

我可以為第一次運行序列化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();
        }
    }

或者,我是否必須將新客戶添加到現有客戶的數組列表中,並將更新后的arraylist傳遞給序列化方法? 每次添加新客戶時重寫新文件都有效,我想知道是否有辦法將新客戶添加到現有文件中。

您必須將新客戶添加到現有客戶的陣列列表中,並將更新的arraylist傳遞給序列化方法。

您應該將新客戶添加到現有客戶的陣列列表中,並將其傳遞給您的方法

首先

您不能使用不同的ObjectOutputStream將任何數據附加到文件。 您可以閱讀這些StackOverflow問題附加到ObjectOutputStreamjava.io.StreamCorruptedException:無效的類型代碼:AC以了解為什么不能這樣做。 但簡而言之,這是因為每個新的ObjectOutputStream都會將它的標頭附加到文件中,這會破壞它。 因此,您應該使用單個ObjectOutputStream實例將所有對象寫入文件。

其次

您無法序列化多個Customer對象,並將它們反序列化為一個ArrayList<Customer>對象。 因為不同對象的序列化數據差別很大。 每個序列化數據都包含有關序列化對象類型,字段名稱,字段類型等的元數據。不知何故, ObjectOutputStream標記每個序列化對象的開始結束ObjectInputStream使用這些標記來了解如何反序列化對象。 這意味着如果你將2個對象寫入ObjectOutputStream你的ObjectInputStream將清楚地讀取這兩個對象。

因此 ,如果要序列化多個Customer對象,然后將它們反序列化為一個ArrayList<Customer>那么您應該實現自己的序列化/反序列化邏輯。

或者,您可以將新Customer添加到ArrayList ,然后擦除文件的所有內容並將ArrayList封裝到該文件,但這會導致性能問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM