2013-12-08 29 views
2

我有一個繼承樹的系列化其中
Class A implements Serializable{}
Class B extends A{}Class C extends B{}等高達class Z extends Y{}停止在繼承樹中一些類類型Java中

根據連載:

「既然Class A工具Serializable,直到Z的所有子類都變成'可串行化'「。當我們嘗試序列化對象Z時,所有的超類對象都會被序列化。

問:

我怎樣才能避免Class C對象獲取序列化,當我序列化的Z Class對象?

+5

有了'Serializable',你不能選擇序列化字段而不是其他字段。您可以使用'transient'修飾符標記一個字段,以便它不會被序列化。 –

+0

@SotiriosDelimanolis我們有其他的選擇嗎? – Suhail

+0

不要使用Java序列化,請使用其他格式,如XML或JSON。 –

回答

1

對,如果C在Z的超類鏈中,並且你想要序列化Z,那麼C也將被序列化。您可以使用以下其中一種技術避免或解決此問題:

重新排列類層次結構。

也就是說,使C不再Z的超想必你不希望這樣做,但它可能是合理考慮給予不序列化C.

控制領域的目標的C序列化。

您可以標記爲transient未被序列化的C的字段。也許更好的是在C中聲明一個serialPersistentFields數組,可能是空的,包含要被序列化的C的字段的名稱。這比標記不想序列化爲transient的字段更容易或更易於維護。請注意,C仍然是序列化的,但其字段的序列化可以省略。

爲C.

也就是說,使用readObjectwriteObject方法提供了一種自定義序列格式。如果您沒有從writeObject方法中調用defaultWriteObject,則不會發生C的自動字段序列化。同樣,請勿在readObject方法中調用defaultReadObject。請注意,如上所述,這仍然序列化C本身,但避免序列化其部分或全部字段。

提供了串行化代理爲Z.

提供一個writeReplace方法Z的writeReplace方法安排的事情,使得當有人請求序列化Z,一不同對象(稱爲ZProxy例如)是序列化。讓你的writeReplace方法構造一個ZProxy實例,它包含你想要序列化的Z的數據,並返回該ZProxy實例。該instnace將被序列化以代替Z實例。 ZProxy不必與Z具有相同的類層次結構;它可以完全無關。當一個ZProxy實例被反序列化時,確保ZProxy有一個readResolve方法,該方法根據ZProxy中的數據構造一個Z實例,並返回Z實例。

請參閱Bloch,有效的Java,第78項關於序列化代理的更多信息。

您可能還想提供一個引發異常的Z.readObject方法,以防止某人僞造一個聲稱包含Z的序列化實例並隨後將其反序列化的序列化字節流。這強制了只有ZProxy實例出現在序列化字節流中的約束,而不是實際的Z實例。

+0

謝謝..非常豐富.. – Suhail