1. 程式人生 > >Android使用Parcelable序列化複雜資料結構

Android使用Parcelable序列化複雜資料結構

前言

說到序列化我們都不陌生,最簡單的就是讓我們的實體類來實現java io包下的Serializable介面即可,但是android單獨又寫了自己的序列化方案,即Parcelable,它比Serializable更快,效率更高,佔用記憶體更少!因此也是Google推薦的序列化方案!
而且如果我們在activity之間傳遞複雜資料結構時,會發現bundle,intent等不支援實現Serializable介面的複雜資料結構型別。

使用

使用的話,這裡就不再詳細說了,應該是大家都比較熟悉的內容:
①實現Parcelable介面,並寫出共有無參構造器,供外部使用。
②重寫int describeContents()

方法,一般預設返回0即可;重寫void writeToParcel(Parcel dest, int flags)方法,將欄位write進Parcel中。
③建立私有帶參Parcel構造器

private xxxxEntity(Parcel source){
    //這裡read欄位的順序要與write的順序一致
    xx=source.readString();
}

④建立常量Creator,並實現該介面的兩個方法。

public static final Parcelable.Creator<xxxxEntity> CREATOR = new Creator<xxxxEntity>(){
    @Override
public CheckContentEntity createFromParcel(Parcel source) { return new xxxxEntity(source); } @Override public CheckContentEntity[] newArray(int size) { return new xxxxEntity[size]; } };

上邊就是大概的一個使用流程!

複雜資料結構的序列化

下邊說一下本篇文章的重點內容:
①List型別
我們在write的時候:dest.writeList(list);


在read的時候需要注意:如果list的泛型為String,則
xx=source.readArrayList(String.class.getClassLoader());如果泛型為Integer,則傳入的類載入器為Integer.class.getClassLoader()
如果我們的泛型物件是另一個已經序列化號的物件呢,傳入類載入器則為:OtherEntity.class.getClassLoader
②Map型別
write:dest.writeMap(map);即可
read:source.readHashMap(HashMap.class.getClassLoader());
③Array陣列
write:
注意:首先我們需要把陣列的長度wirte進去

if (array!= null) {  
    dest.writeInt(array.length);  
} else {  
    dest.writeInt(0);  
} 

然後我們要根據陣列的型別來選擇不同的write方法
比如String:dest.writeStringArray(array);
read:
同樣的,我們要先獲取陣列的長度:

int length = in.readInt();  
array = new String[length];  

然後再根據型別呼叫不同的read方法
in.readStringArray(array);

④實體類
如果這個實體類實現Serializable介面
write:dest.writeSerializable(entity);
read:source.readSerializable();
如果這個實體類實現Parcelable介面
write:dest.writeParcelable(otherEntity,flags);
read:source.readParcelable(OtherEntity.class.getClassLoader());