Java技巧:序列化的兩種方式

大家都知道Serializable是一個mark interface,告訴JVM這個對象可以被轉換成二進制流來傳輸.
Serializable 在我們實現這個接口的時候,我們可以使用4個私有方法來控制序列化的過程: 
我們來看一個例子:
我們運行這段代碼看到的debug信息:
writeReplace invoked
writeObject invoked
readObject invoked
readResolve invoked

當進行序列化的時候:
首先JVM會先調用writeReplace方法,在這個階段,我們可以進行張冠李戴,將需要進行序列化的對象換成我們指定的對象.
跟着JVM將調用writeObject方法,來將對象中的屬性一個個進行序列化,我們可以在這個方法中控制住哪些屬性需要序列化.

當反序列化的時候:
JVM會調用readObject方法,將我們剛剛在writeObject方法序列化好的屬性,反序列化回來.
然後在readResolve方法中,我們也可以指定JVM返回我們特定的對象(不是剛剛序列化回來的對象).


Externalizable 是一個有實際方法需要實現的interface,包括writeExternal和readExternal,是Serializable接口的子接口:

我們運行這段代碼看到的debug信息:
writeReplace invoked
writeExternal invoked
readExternal invoked
readResolve invoked
在此writeExternal 和readExternal 的作用與writeObject和readObject 一樣.

最後,當我們同時實現了兩個interface的時候,JVM只運行Externalizable 接口裏面的writeExternal 和readExternal 方法對序列化內容進行處理.
需要注意的是:Serializable是一個真正的mark interface,
writeObject,readObject, writeReplace,readResolve是直接與JVM通信,告訴JVM序列化的內容.
發佈了33 篇原創文章 · 獲贊 0 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章