天天看點

序列化 Parcelable && Serializable

對象的序列化和反序列化: 使用場景:網絡傳輸,跨程序傳輸

序列化就是将對象轉換成位元組流, 反序列化是将位元組流轉換成對象 

Serializable 屬于java 提供的機制,使用簡單,将需要序列化的類 implements Serializable即可,注意,如果有字段不想序列化,使用static(修飾類字段,而序列化是針對對象的) 或 transient (transient代表對象的臨時資料)即可。

Serializable 序列化,反序列化原理: 

1 将對象轉換成位元組碼寫入一個臨時檔案,

2 從臨時檔案讀取位元組流,并轉換成對象

認識serialVersionUID

Java的序列化機制是通過在運作時判斷類的serialVersionUID來驗證版本一緻性的。在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認為是一緻的,可以進行反序列化,否則就會出現序列化版本不一緻的異常。當實作java.io.Serializable接口的實體類沒有顯式地定義一個名為serialVersionUID,類型為long的變量時,Java序列化機制會根據編譯的class自動生成一個serialVersionUID作序列化版本比較用,這種情況下,隻有同一次編譯生成的class才會生成相同的serialVersionUID。是以為了實作序列化接口的實體能夠相容先前版本,最好顯式地定義一個名為serialVersionUID類型為long的變量,這樣就不會存在版本不一緻的問題。

相關文章: 

http://www.importnew.com/24490.html

http://jessehzx.top/2018/05/10/java-serializable/

Parcelable:  Android提供的一種序列化手段,需要支援序列化的類 implements Parcelable即可

原理: 将需要序列化的對象轉換成位元組流寫入一段共享記憶體,反序列化時從共享記憶體中讀取位元組流并轉換成相應對象

最終調用都是通過Parcel來實作的

參考文章: https://www.jianshu.com/p/32a2ec8f35ae

 Parcelable和Serializable的差別和比較

Parcelable和Serializable都是實作序列化并且都可以用于Intent間傳遞資料,Serializable是Java的實作方式,可能會頻繁的IO操作,是以消耗比較大,但是實作方式簡單 Parcelable(屬于記憶體級操作)是Android提供的方式,效率比較高,但是實作起來複雜一些 , 二者的選取規則是:記憶體序列化上選擇Parcelable, 存儲到裝置或者網絡傳輸上選擇Serializable(當然Parcelable也可以但是稍顯複雜)

PROTOBUF 相關

https://halfrost.com/protobuf_encode/