對,如果C在Z的超類鏈中,並且你想要序列化Z,那麼C也將被序列化。您可以使用以下其中一種技術避免或解決此問題:
重新排列類層次結構。
也就是說,使C不再Z的超想必你不希望這樣做,但它可能是合理考慮給予不序列化C.
控制領域的目標的C序列化。
您可以標記爲transient
未被序列化的C的字段。也許更好的是在C中聲明一個serialPersistentFields
數組,可能是空的,包含要被序列化的C的字段的名稱。這比標記不想序列化爲transient
的字段更容易或更易於維護。請注意,C仍然是序列化的,但其字段的序列化可以省略。
爲C.
也就是說,使用readObject
和writeObject
方法提供了一種自定義序列格式。如果您沒有從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實例。
有了'Serializable',你不能選擇序列化字段而不是其他字段。您可以使用'transient'修飾符標記一個字段,以便它不會被序列化。 –
@SotiriosDelimanolis我們有其他的選擇嗎? – Suhail
不要使用Java序列化,請使用其他格式,如XML或JSON。 –