為什么要序列化
1.實現(xiàn)Parcelable就是為了進行序列化,那么蓉坎,為什么要序列化澳眷?
1)永久性保存對象,保存對象的字節(jié)序列到本地文件中袍嬉;
2)通過序列化對象在網(wǎng)絡(luò)中傳遞對象境蔼;
3)通過序列化在進程間傳遞對象。2.實現(xiàn)序列化的方法
Android中實現(xiàn)序列化有兩個選擇:一是實現(xiàn)Serializable接口(是JavaSE本身就支持的)伺通,一是實現(xiàn)Parcelable接口(是Android特有功能箍土,效率比實現(xiàn)Serializable接口高效,可用于Intent數(shù)據(jù)傳遞罐监,也可以用于進程間通信(IPC))吴藻。實現(xiàn)Serializable接口非常簡單,聲明一下就可以了弓柱。
** 實現(xiàn)Parcelable接口稍微復(fù)雜一些沟堡,但效率更高。(推薦這種)**3.Parcelable接口定義
public interface Parcelable {
//內(nèi)容描述接口矢空,基本不用管
public int describeContents();
//寫入接口函數(shù)航罗,打包
public void writeToParcel(Parcel dest, int flags);
//讀取接口,目的是要從Parcel中構(gòu)造一個實現(xiàn)了Parcelable的類的實例處理屁药。
//因為實現(xiàn)類在這里還是不可知的粥血,所以需要用到模板的方式,繼承類名通過模板參數(shù)傳入酿箭。
//為了能夠?qū)崿F(xiàn)模板參數(shù)的傳入复亏,這里定義Creator嵌入接口,內(nèi)含兩個接口函數(shù)分別返回單個和多個繼承類實例 。
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size); }
}
- 4.實現(xiàn)Parcelable步驟
1)implements Parcelable
2)重寫writeToParcel方法缭嫡,將你的對象序列化為一個Parcel對象缔御,即:將類的數(shù)據(jù)寫入外部提供的Parcel中,打包需要傳遞的數(shù)據(jù)到Parcel容器保存妇蛀,以便從 Parcel容器獲取數(shù)據(jù)
3)重寫describeContents方法耕突,內(nèi)容接口描述,默認(rèn)返回0就可以
4)實例化靜態(tài)內(nèi)部對象CREATOR實現(xiàn)接口Parcelable.Creator
總結(jié):
通過writeToParcel將你的對象映射成Parcel對象讥耗,再通過createFromParcel將Parcel對象映射成你的對象有勾。也可以將Parcel看成是一個流,通過writeToParcel把對象寫到流里面古程,在通過createFromParcel從流里讀取對象蔼卡,只不過這個過程需要你來實現(xiàn),因此寫的順序和讀的順序必須一致。
示例代碼如下
public class MyParcelable implements Parcelable{
private int mData;
public int describeContents(){
return 0;}
public void writeToParcel(Parcel out, int flags){
out.writeInt(mData); }
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(); }
}