2012-03-24 76 views
19

我讀Java的ArrayList的來源,我在其支持數組聲明傳來:爲什麼ArrayList使用瞬態存儲?

private transient Object[] elementData; 

爲什麼會出現這種需要是暫時的?爲什麼這個課程不能被序列化?

感謝您的幫助!

回答

23

可以被序列化; ArrayList類只是自己處理事情,而不是使用默認機制。請查看該類中的writeObject()readObject()方法,它們是標準序列化機制的一部分。

如果你看看源代碼,你會發現writeObject()不保存支持數組。相反,它會一次一個地串行化元素(包括空值),直到限制爲size()。這樣可以避免序列化數組的開銷,特別是數組末尾的任何未使用的插槽。在反序列化中,由readObject()創建了最小所需大小的新備份數組。

5

爲什麼這需要是暫時的?

這樣做是因爲它提供了自定義readObjectwriteObject方法,可以比默認方式更好地進行序列化。具體來說,writeObject方法只寫入元素的大小和順序。這樣可以避免序列化私有數組對象,這些對象有:1)擁有自己的頭部和開銷; 2)通常用null填充。節省空間可能很大。

(其實,我不認爲現場嚴格需要將在所有聲明transient,但它確實有助於記錄開發者的意圖。)

爲什麼」這個班級被序列化了嗎?

ArrayList類作爲一個整體可以被序列化。 Object[]可能會被序列化,但他們選擇以另一種方式實現它。


1 - 實際上,這依賴於元素的運行時類型。例如,如果您試圖序列化包含Thread引用的ArrayList,那麼您將獲得第一個非空引用的運行時異常。

1

因爲它實現了顯式序列化。請參閱ArrayList#writeObject。

3

ArrayList實現Serializable,所以可以被序列化,這也正是爲什麼私人支持數組是transient,所以它不與類中的其他數據一起被序列化,因爲所有由的writeObjectreadObjectArrayList處理方法。

1

變量如果變量是不可序列化,那麼當它嘗試序列變量序列化機制將拋出一個異常是不可串行

  • 。爲了避免這種情況,您可以聲明該變量是暫時的。

該變量是冗餘

  • 假設實例緩存的計算的結果。在本地,我們可能想要 存儲計算結果,以節省一些處理器時間。但是當我們通過線路發送對象時,我們可能會更多地擔心消耗帶寬 ,並因此丟棄緩存的計算,因爲我們隨時可以重新生成它。

鏈接:http://onjava.com/pub/a/onjava/excerpt/JavaRMI_10/index.html?page=3

相關問題