我讀了Externalizable與Serializable有什麼不同?
外部化給我們提供的writeExternal()和readExternal()方法,它爲我們提供了靈活的控制,而不是依賴於Java的默認序列化Java序列化機制。
但如果我實現Serializable接口,並覆蓋readObject(), writeObject(),
然後不也意味着同樣的,我自定義序列化進程?
它是如何不同?
THanks。和外部化之間
我讀了Externalizable與Serializable有什麼不同?
外部化給我們提供的writeExternal()和readExternal()方法,它爲我們提供了靈活的控制,而不是依賴於Java的默認序列化Java序列化機制。
但如果我實現Serializable接口,並覆蓋readObject(), writeObject(),
然後不也意味着同樣的,我自定義序列化進程?
它是如何不同?
THanks。和外部化之間
差分串行化
- 在序列化的,默認序列化處理的情況下被使用。而在使用Externalizable自定義序列化過程的情況下,由應用程序執行。
- JVM將回調到java.io.Externalizalbe接口的readExternel()和writeExternal(),以便將對象恢復和寫入持久性。
- Externalizable接口提供對應用程序的序列化過程的完全控制。
- 的readExternal()和的writeExternal()取代任何特定實現的writeObject和readObject方法。
雖然Externalizable提供了完整的控制權,但它也對序列化超類型狀態並在Java中使用瞬態變量和靜態變量時處理默認值提出了挑戰。如果使用正確的Externalizable接口可以提高序列化過程的性能。
所以要爲Externalizable接口
當你有一個對象的序列化的特殊要求。例如,你可能有一些對安全敏感的對象部分,比如密碼,你不想保存和傳輸到某個地方。或者,保存從主對象引用的特定對象可能毫無價值,因爲在恢復後它的值將變得毫無價值。
Official docs on Bean Persistence
當你需要的時候,你需要序列化缺省的序列化不能處理,或者當您需要將數據添加到序列化流對象行使什麼獲取序列更大的控制權實現的writeObject那不是對象數據成員。實現readObject來重建您用writeObject寫入的數據流。
當您需要完全控制bean的序列化時(例如,在寫入和讀取特定文件格式時),請使用Externalizable接口。要使用Externalizable接口,您需要實現兩個方法:readExternal和writeExternal。實現Externalizable的類必須有一個無參數的構造函數。
@Prabhaker ...你不覺得同樣可以實現使用自定義序列化(writeObject和readObject)嗎? –