Android使用Parcelable序列化複雜資料結構
前言
說到序列化我們都不陌生,最簡單的就是讓我們的實體類來實現java io包下的Serializable介面即可,但是android單獨又寫了自己的序列化方案,即Parcelable,它比Serializable更快,效率更高,佔用記憶體更少!因此也是Google推薦的序列化方案!
而且如果我們在activity之間傳遞複雜資料結構時,會發現bundle,intent等不支援實現Serializable介面的複雜資料結構型別。
使用
使用的話,這裡就不再詳細說了,應該是大家都比較熟悉的內容:
①實現Parcelable介面,並寫出共有無參構造器,供外部使用。
②重寫int describeContents()
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());