2010-12-20 100 views
3

當我們在java中開發一個類時,是否應該使該類可序列化的決定通常很簡單。如果類表示可以通過n/w傳輸的模型對象,則它應該是可序列化的。
這個推理是否正確?
如果是這樣,那麼一些原生Java API類的序列化後的邏輯是可序列化的,而另一些則不是?
從實現Serilizable的本地類的列表中,似乎有多個原因來實現可序列化。
http://download.oracle.com/javase/6/docs/api/java/io/class-use/Serializable.html實現可序列化的類

任何澄清,將不勝感激。

回答

0

如果這個類表示一個模型對象,它可以通過 n/w傳輸,它應該是可序列化的。 這個推理是否正確?

這個推理有點正確。如果你正在創建一個兼容性非常重要的公共API,你可能希望創建一個序列化的類,這些類可能需要序列化,這些類可能需要可能。但是,如果你正在創建一個私有應用程序,那麼類只能在需要時才能被序列化。試圖避免實現Serializable的一個原因是它引入了需要維護和保護新添加的「接口」到您的可序列化類:它的字節碼錶示。

如果是這樣,什麼是落後一些本地的Java API類是 序列化的,而有些則沒有邏輯?從實現可串行化的本地類 的列表中,看起來存在多於一個的 原因來實現可序列化。

一個爲什麼許多類的Java API中沒有實現Serializable的主要原因是,由於接口和傳承的性質,從而延長它實現Serializable還必須實現Serializable類的任何類。例如,如果java.lang.Object implemented Serializable,每個java類都需要設計爲可正確序列化。這會給任何類的設計帶來很大的負擔:突然間,需要考慮安全性和字節碼的有效性和兼容性。

+0

比從未更好的遲到。 – Kevin 2013-11-21 11:05:40

0

什麼時候執行Serializable的決定應該是而不是很簡單。

實現此接口將您的類暴露給創建對象的extralinguistic機制。爲了這個目的,異常語言意味着在Java語言中通常的構造機制之外。這實際上是一件壞事,這意味着您可能需要重新驗證反序列化對象上的所有類不變量,並強制實例控制(如果放置了這樣的系統)。

它可以使你的班級容易受到攻擊並容易受到安全攻擊。它也可能危及封裝/信息隱藏(因此,如果不做深思熟慮的話,永遠將你與特定的實現捆綁在一起)。

實現Serialzable應該是一個有意識的有意識的選擇......然後,只有這樣,才應該只序列化對象的邏輯狀態。所有其他領域應該被標記爲瞬態的。

相關問題