2012-02-28 44 views
0

.class文件爲每種類型的對象提供藍色打印,Java具有豐富的功能來提取對象的屬性,包括其所有狀態。 那麼爲什麼我們仍然需要實現可序列化,我們是否可以在給定.class文件的情況下自動序列化?是否可以自動序列化知道.class文件的對象

+1

允許一個類被序列化並不總是可取的。一個例子是安全性。如果對象的實例包含密碼,我們可能不希望將其寫入磁盤。 – Asaph 2012-02-28 17:52:28

回答

3

Serializable接口是一個標記接口,它在它沒有方法或字段。它只是由我們可能想要序列化的對象實現。

而且序列化是一個昂貴的事,因爲(從有效的Java第二版兩者):

  1. 實現Serializable接口的主要成本是它降低了靈活性 改變類的實現,一旦它已經釋放。當 類實現Serializable時,其字節流編碼(或序列化形式) 成爲其導出的API的一部分。一旦廣泛分發課程,您通常需要 才能永久支持序列化表單,就像您要求 支持導出的API的所有其他部分一樣。

  2. 實施Serializable的第二個成本是它增加了錯誤和安全漏洞的可能性 。

  3. 實現Serializable接口的第三個代價是增加了與釋放類的新版本相關的測試 負擔。當修改可序列化的 類時,檢查是否可以序列化新版本的 中的實例並將其反序列化爲舊版本,反之亦然。

+0

正如您所提到的,「當類實現Serializable時,其字節流編碼(或序列化形式)成爲其導出的API的一部分」,爲什麼java不能通過查看.class文件生成唯一的字節順序?我問這個問題的原因是,如果java可以,他們會附加一個.class文件並自動序列化(我知道給一個.class文件不會很好,但至少它是一個選擇)。在我看來,它仍然存在一些微妙的問題。 – 2012-02-28 18:40:16

+0

@Helin Wang:默認情況下,它可以並且自動序列化一個類實例,但是如果你改變這個類,那麼新版本就無法讀取舊的那個。如果你自己處理這個問題,你可以輸入版本號,或者以其他方式解碼舊版本的數據。 – RalphChapin 2012-02-28 20:09:55

0

可序列化只是一個標記接口;你不需要提供任何實現。 Java將提供一個適用於大多數情況的合理的默認實現。在Java

0

鑑於一個對象可以引用一堆其他對象,序列化該類會變得非常有趣。序列化一個對象可能導致成千上萬的對象被序列化。結果可以毫不費力和出色,但99.9%的時間您需要控制和限制至少一部分操作。當您將類實例移到長期打開的套接字上時,尤其如此。

因此,標記一個類「可序列化」是指出你已經想通了所有的分支。這些可能是微不足道的,也可能是巨大而複雜的。但要小心:向流中寫入一個類實例可以將導致序列化已知Universe的一半。