2009-06-09 94 views
16

我一直在學習如何使用Serializable誰實際上實現了可序列化的方法?

我知道我是否創建了一個具有不同變量的類A,實現了Serializable,並且我將Serializable添加到了我的班級,它也是Serializable

但是,誰實際上正在實現這兩種方法序列化? Object是否照顧一切或不同類別在必要時重載?

回答

15

序列化實際上是在java.io.ObjectOutputStream(和java.io.ObjectInputStream)及其一些輔助類中實現的。在很多情況下,這種內置支持已經足夠,開發人員只需要實現標記界面Serializable。這個接口被稱爲「標記」,因爲它沒有聲明任何方法,因此在實現類上不需要任何特殊的API。

如果需要,程序員可以使用自己的方法添加或替換默認序列化機制。例如,如果反序列化對象後,需要一些額外的初始化,可以用下面的簽名添加的方法:

private void readObject(java.io.ObjectInputStream s) 
       throws java.io.IOException, java.lang.ClassNotFoundException 

在過去的序列化和反序列化總控制,實現java.io.Externalizable代替Serializable

如果需要,Java序列化中還有許多其他擴展點。 serialization specification是一個權威和完整的來源,瞭解他們所有的人。

-1

如果你實現了一個必須是可序列化的類,你還必須提供一個方法,它可以在同一個類中進行序列化。

你不能依靠Object來猜測你的類需要被成功序列化和反序列化。考慮你的類的工作變量,例如不需要序列化的對象,Object不能區分那些重要的字段。

+2

這就是transient關鍵字的用途:在序列化對象時跳過這些字段。 – Chochos 2009-06-09 15:55:32

+1

默認序列化通常對於要做什麼是正確的。如果有'不重要'的領域,爲什麼甚至把它們放在你的對象中呢? – Jorn 2009-06-09 15:56:52

+1

你是什麼意思的「必須」? – 2009-06-09 15:57:08

7

我想你所說的方法是readObject()writeObject()。如果您需要執行自定義序列化,則只需實現這些操作,例如,當對象中的字段不可序列化時。如果您只有可序列化的字段和基元,則不必實現自定義序列化方法。 此外,您可以通過向其添加transient關鍵字來跳過序列化中的某些字段。

1

我知道如果我使用實現Serializable的不同變量創建類'A',並且將Serializable添加到我的類中,它也是Serializable。

是的,這一刻你的課是Serializable。

3

請看SerializableAPI doc,詳細解釋了機制。

基本上,除非您想要更多地控制對象的序列化方式,否則不必做任何事情,在這種情況下,您可以實現一些「魔術」方法,並且這些方法將由序列化機制調用。

如果你想完全控制,你可以使用Externalizable來代替。

1

對於可序列化的類,每個包含爲該類成員的對象也必須是可序列化的。 Java將沿着您所引用的所有對象的樹運行,並依次將它們序列化。

如果你想有超過對象的序列化,可以實現Externalizable接口更大的控制權:

的外部化 接口的的writeExternal和readExternal 方法是由類 實現它來爲通過一個對象的 流的格式和內容以及它的 超類型的類完整控制 。

相關問題