1.Android中實現序列化有兩個選擇:
一是實現Serializable接口(是JavaSE本身支持的),另外一種是實現Parcelable接口(效率比Serializable高,是Android特有的,用于Intent傳遞數據,也可用于進程間通信)。
2.那么為什么需要序列化呀?
a)Serializable的作用是為了保存對象的屬性到本地文件、數據庫、網絡流、rmi以方便數據傳輸,當然這種傳輸可以是程序內的也可以是兩個程序間的.例如Intent需要傳遞一個對象,就用Bundle .putSerializable(Key,Object)。前提是你這個對象implement了Serailizable。
b)Android的Parcelable的設計初衷是因為Serializable效率過慢,為了在程序內不同組件間以及不同Android程序間(AIDL)高效的傳輸數據而設計,這些數據僅在內存中存在,Parcelable是通過IBinder通信的消息的載體。例如Intent需要傳遞一個對象,就用Bundle .putParcelable(Key,Object)。前提是你這個對象implement了Parcelable。
3.兩者對比:
1)在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。
2)Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
3)Parcelable不能使用在要將數據存儲在磁盤上或網絡傳輸數據的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。因為android不同版本Parcelable可能不同,所以不推薦使用Parcelable進行數據持久化盡管Serializable效率低點,但此時還是建議使用Serializable 。
4.代碼實現
實現Serializable接口非常簡單,只需要implements Serializable就可以了,有些變量如果不需要序列化的話就加上transient聲明。
實現Parcelable接口略微有趣一些:
先看看Parcelable接口定義:
再介紹一下Parcel吧:
意思大概是Parcel是一個在序列化過程中的容器,可以write進去,然后read出來,看不懂的妹子可以打電話或者微信視頻我。
實現Parcelable步驟:
1.在WriteToParcel方法中寫入自己需要的變量
2.創建私有的構造方法,按順序,按順序,按順序,把變量讀出來
實例化靜態內部對象CREATOR實現接口Parcelable.Creator
注:其中public static final一個都不能少,內部對象CREATOR的名稱也不能改變,必須全部大寫。需重寫本接口中的兩個方法:createFromParcel(Parcel in) 實現從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回邏輯層,newArray(int size) 創建一個類型為T,長度為size的數組,僅一句話即可(return new T[size]),供外部類反序列化本類數組使用。