父類實現(xiàn)Serializable接口時,其字段隨子類自動序列化;未實現(xiàn)時,父類字段不被保存,反序列化需通過無參構(gòu)造函數(shù)重建,且必須手動處理字段讀寫。
Java對象序列化時,父類字段的處理方式取決于父類是否實現(xiàn)了Serializable
接口。序列化機制會根據(jù)這一條件決定如何處理繼承層次中的字段。
如果父類也實現(xiàn)了Serializable
接口,那么整個對象的字段(包括父類和子類)都會自動被序列化機制處理。
這種情況下,所有字段都遵循默認的序列化流程:
transient
和非static
字段會被自動序列化如果父類沒有實現(xiàn)Serializable
接口,序列化行為會發(fā)生變化,這是開發(fā)中容易出錯的地方。
立即學(xué)習(xí)“Java免費學(xué)習(xí)筆記(深入)”;
此時,子類可以正常序列化自己的字段,但父類字段不會被自動保存。反序列化時,這些字段將使用父類無參構(gòu)造函數(shù)重新初始化。
關(guān)鍵點:
InvalidClassException
在父類未實現(xiàn)Serializable
的情況下,可以通過以下方式精確控制字段處理:
writeObject
和readObject
方法手動處理父類字段readObject
中顯式調(diào)用父類邏輯來恢復(fù)狀態(tài)ObjectInputStream.defaultReadObject()
和ObjectOutputStream.defaultWriteObject()
配合自定義邏輯例如,當需要保留非Serializable父類的字段值時,可以在子類中:
private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); out.writeInt(parentField); // 手動寫入父類字段 } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); parentField = in.readInt(); // 手動恢復(fù)父類字段 }基本上就這些。核心是看父類是否可序列化,決定了字段是自動處理還是需要手動干預(yù)。
以上就是Java對象序列化時父類字段如何處理的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號