[英]Why is the ArrayList size field not transient?
Java 的ArrayList
使用自定義序列化並顯式寫入size
。 然而,大小沒有在ArrayList
中標記為transient
。 為什么 size 寫了兩次:一次是通過defaultWriteObject
,另一次是 vis writeInt(size)
,如下所示( writeObject
方法)?
s.defaultWriteObject();
// Write out size as capacity for behavioral compatibility with clone()
s.writeInt(size);
// Write out all elements in the proper order.
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
}
它的存在僅僅是為了與舊的 java 版本兼容。
如果您查看s.writeInt(size)
上面的注釋,您會發現這應該是容量。 在之前的 java 版本中, ArrayList
的序列化形式具有大小和容量。
它們都代表ArrayList
的實際屬性。 size
表示ArrayList
中的項數,而capacity
是指在不需要重新創建數組的情況下其中可能的項數(數組的長度)。
如果您查看readObject
,您會發現容量被忽略了:
// Read in capacity
s.readInt(); // ignored
這是因為它在以前的 java 版本中使用,仍然需要寫入/讀取以保持兼容性。
如果您查看匹配的 JDK6 源代碼,您會發現這實際上是以前使用過的。 如果你有一個序列化的 JDK6 ArrayList
並嘗試用更新的 JDK 反序列化它,它會起作用。 但是,如果剛剛跳過容量,這將失敗,並且您無法使用舊版本中的ArrayList
反序列化任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.