[英]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問題附加到ObjectOutputStream和java.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.