1. 程式人生 > >java的序列化和反序列化

java的序列化和反序列化

java提供了兩種物件持久化的方式,分別是序列化和反序列化

序列化

當進行遠端通訊時,無論是何種型別的資料,都會以二進位制的形式在網路上傳輸.序列化是將物件描述為一連串位元組的過程,用來解決物件流的讀寫問題.序列化可以將物件的狀態寫在流裡進行網路傳輸,或者儲存在檔案.資料庫等系統中,並在需要時可以把流讀取出來重新構造一個新的物件

序列化的特點:

①如果一個類被序列化,那麼它的子類也能夠被序列化

②由於static代表的是類成員,transient代表物件的臨時資料,因此被宣告為這兩種資料型別的資料成員是不能夠被序列化的

③序列化的使用會影響系統的效能,如果不是必須要使用序列化,就儘量不要用

什麼情況下需要使用序列化?

①通過網路傳輸物件

②物件的狀態需要被持久化的資料庫或者檔案中

③使用序列化來實現深複製

如何實現序列化?

所有要實現序列化的類都必須實現Serializable介面

什麼是反序列化?

與序列化相對的就是反序列化,它將流轉換為物件.在序列化和反序列化的過程,serialVersionUID起著非常重要的作用,每個類都有一個特定的serialVersionUID,在反序列化的過程中,通過serialVersionUID來判定類的相容性.如果待序列化的物件和目標物件的serialVersionUID不同,那麼在反序列化時就會丟擲InvalidClassException異常.最好再被序列化的類中顯式地宣告serialVersionUID(該欄位必須定義為static final)

自定義serialVersionUID的優點?

①提高程式的執行效率

②提高程式在不同平臺上的相容性

③增強程式各個版本的相容性

外部序列化

java語言中還提供了另外一種方式來實現物件的持久化,即外部序列化

外部序列化和序列化的區別?

序列化在使用時,只需要實現Serializable介面就可以了;使用外部序列化時,Externalizable介面中的讀寫方法必須由開發人員來實現

在用Serializable實現序列化時,這個類的所有屬性都會被序列化,那麼怎樣才能實現只序列化部分屬性呢?

①實現Externalizable介面,根據實際需求來實現readExternal和writeExternal方法來控制序列化和反序列化所使用的屬性,這種方法的缺點是增加了程式設計的難度

②使用關鍵字transient來控制序列化的屬性.被transient修飾的屬性是臨時的,不會被序列化