我讀Java的ArrayList的來源,我在其支持數組聲明傳來:爲什麼ArrayList使用瞬態存儲?
private transient Object[] elementData;
爲什麼會出現這種需要是暫時的?爲什麼這個課程不能被序列化?
感謝您的幫助!
我讀Java的ArrayList的來源,我在其支持數組聲明傳來:爲什麼ArrayList使用瞬態存儲?
private transient Object[] elementData;
爲什麼會出現這種需要是暫時的?爲什麼這個課程不能被序列化?
感謝您的幫助!
它可以被序列化; ArrayList
類只是自己處理事情,而不是使用默認機制。請查看該類中的writeObject()
和readObject()
方法,它們是標準序列化機制的一部分。
如果你看看源代碼,你會發現writeObject()
不保存支持數組。相反,它會一次一個地串行化元素(包括空值),直到限制爲size()
。這樣可以避免序列化數組的開銷,特別是數組末尾的任何未使用的插槽。在反序列化中,由readObject()
創建了最小所需大小的新備份數組。
爲什麼這需要是暫時的?
這樣做是因爲它提供了自定義readObject
和writeObject
方法,可以比默認方式更好地進行序列化。具體來說,writeObject方法只寫入元素的大小和順序。這樣可以避免序列化私有數組對象,這些對象有:1)擁有自己的頭部和開銷; 2)通常用null
填充。節省空間可能很大。
(其實,我不認爲現場嚴格需要將在所有聲明transient
,但它確實有助於記錄開發者的意圖。)
爲什麼」這個班級被序列化了嗎?
的ArrayList
類作爲一個整體可以被序列化。 Object[]
可能會被序列化,但他們選擇以另一種方式實現它。
1 - 實際上,這依賴於元素的運行時類型。例如,如果您試圖序列化包含Thread
引用的ArrayList
,那麼您將獲得第一個非空引用的運行時異常。
因爲它實現了顯式序列化。請參閱ArrayList#writeObject。
ArrayList
實現Serializable
,所以可以被序列化,這也正是爲什麼私人支持數組是transient
,所以它不與類中的其他數據一起被序列化,因爲所有由的writeObject
和readObject
ArrayList
處理方法。
變量如果變量是不可序列化,那麼當它嘗試序列變量序列化機制將拋出一個異常是不可串行
該變量是冗餘
鏈接:http://onjava.com/pub/a/onjava/excerpt/JavaRMI_10/index.html?page=3