Java序列化進階:Java內置序列化的三種方式

編程語言 Java Java虛擬機 腳本語言 開發技術專注者 2017-06-07

Java序列化就是把Java對象按照一定的格式存到文件或者磁盤當中,那麼Java內置的序列化有幾種方式呢?每種方式的相同點和不同點是什麼呢?

序列化的進階:即三種方式,任何一種方式都可以進行序列化和反序列化

第一種

使用默認的序列化機制,即實現Serializable接口即可,不需要實現任何方法。

該接口沒有任何方法,只是一個標記而已,告訴Java虛擬機該類可以被序列化了。然後利用ObjectOutputStream進行序列化和用ObjectInputStream進行反序列化。

注意:

該方式下序列化機制會自動保存該對象的成員變量,static成員變量和transient關鍵字修飾的成員變量不會被序列化保存。如:

Java序列化進階:Java內置序列化的三種方式

要序列化的對象

看看序列化和反序列化效果:

Java序列化進階:Java內置序列化的三種方式

序列化和反序列化結果

這是最簡單的一種方式,因為這種方式讓序列化機制看起來很方便(然後,我們在進行對象序列化時,只需要使用ObjectOutputStream和ObjectInputStream的writeObject(object)方法和readObject()方法,就可以把傳入的對象參數序列化和反序列化了,其他不用管)。有時候想自己來控制序列化哪些成員,還有如何保存static和transient成員?

注意:

該方式下,反序列化時不會調用該對象的構造器,但是會調用父類的構造器,如果父類沒有默認構造器則會報錯。static字段是類共享的字段,當該類的一個對象被序列化後,這個static變量可能會被另一個對象改變,所以這就決定了靜態變量是不能序列化的,但如果再加上final修飾,就可以被序列化了,因為這是一個常量,不會改變。

第二種

實現Externalizable接口。

Externalizable接口是繼承自Serializable接口的,我們在實現Externalizable接口時,必須實現writeExternal(ObjectOutput)和readExternal(ObjectInput)方法,在這兩個方法下我們可以手動的進行序列化和反序列化那些需要保存的成員變量。

Java序列化進階:Java內置序列化的三種方式

Externalizable

Java序列化進階:Java內置序列化的三種方式

Externalizable結果

注意:

反序列化時,首先會調用對象的默認構造器(沒有則報錯,如果默認構造器不是public的也會報錯),然後再調用readExternal方法。

這種方式一定要顯式的序列化成員變量,使得整個序列化過程是可控制的,可以自己選擇將哪些部分序列化。

第三種

實現Serializable接口,在該實現類中再增加writeObject方法和readObject方法。該方式要嚴格遵循以下兩個方法的方法簽名:

Java序列化進階:Java內置序列化的三種方式

writeObject和readObject

在這兩個方法裡面需要使用stream.defaultWriteObject()序列化那些非static和非transient修飾的成員變量,static的和transient的變量則用stream.writeObject(object)顯式序列化。

在序列化輸出的時候,writeObject(object)會檢查object參數,如果object擁有自己的writeObject()方法,那麼就會使用它自己的writeObject()方法進行序列化。readObject()也採用了類似的步驟進行處理。如果object參數沒有writeObject()方法,在readObject方法中就不能調用stream.readObject(),否則會報錯。

例如:

Java序列化進階:Java內置序列化的三種方式

序列化舉例

Java序列化進階:Java內置序列化的三種方式

更多文章

  1. Java中最重要的併發編程抽象工具類

  2. Java執行系統命令、外部腳本或外部程序

  3. Java網絡爬蟲工具,OkHttp完全詳細用法

  4. 項目中根據相對路徑和絕對路徑獲取文件/資源的方法

相關推薦

推薦中...