本文主要介紹Parcelable
和Serializable
的作用、效率、區別及選擇。
1、作用
Serializable
的作用是爲了保存對象的屬性到本地文件、數據庫、網絡流、rmi以方
便數據傳輸,當然這種傳輸可以是程序內的也可以是兩個程序間的。而Android的Parcelable
的設計初衷是因爲Serializable
效率過慢,爲了在程序內不同組件間以及
不同Android程序間(AIDL)高效的傳輸數據而設計,這些數據僅在內存中存在,Parcelable
是通過IBinder
通信的消息的載體。
從上面的設計上我們就可以看出優劣了
2、效率及選擇
Parcelable
的性能比Serializable
好,在內存開銷方面較小,所以在內存間數據傳輸
時推薦使用Parcelable
,如activity
間傳輸數據,而Serializable
可將數據持久化方便
保存,所以在需要保存或網絡傳輸數據時選擇Serializable
,因爲android不同版本Parcelable
可能不同,所以不推薦使用Parcelable
進行數據持久化。
3、編程實現
對於Serializable
,類只需要實現Serializable
接口,並提供一個序列化版本id(serialVersionUID)
即可。而Parcelable
則需要實現writeToParcel
、describeContents
函數以及靜態的CREATOR變量,實際上就是將如何打包和解包
的工作自己來定義,而序列化的這些操作完全由底層實現。
Parcelable
的一個實現例子如下
public class MyParcelable implements Parcelable {
private int mData;
private String mStr;
public int describeContents() {
return 0;
}
// 寫數據進行保存
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeString(mStr);
}
// 用來創建自定義的Parcelable的對象
public static final Parcelable.Creator<MyParcelable> CREATOR= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
// 讀數據進行恢復
private MyParcelable(Parcel in) {
mData = in.readInt();
mStr = in.readString();
}
}
從上面我們可以看出Parcel的寫入和讀出順序是一致的。如果元素是list讀出時需要
先new一個ArrayList
傳入,否則會報空指針異常。如下:
list = new ArrayList<String>();
in.readStringList(list);
PS: 在自己使用時,read數據時誤將前面int數據當作long讀出,結果後面的順序錯亂,報如下異常,當類字段較多時務必保持寫入和讀取的類型及順序一致。
12-21 20:14:10.317: E/AndroidRuntime(21114): Caused by: java.lan
g.RuntimeException: Parcel android.os.Parcel@4126ed60: Unmarshal
ling unknown type code 3014773 at offset 164
4、高級功能上
Serializable
序列化不保存靜態變量,可以使用Transient
關鍵字對部分字段不進行序
列化,也可以覆蓋writeObject
、readObject
方法以實現序列化過程自定義。
更多內容詳情請關注我的GitHub:https://github.com/xiangjiana/Android-MS