Parcelable
這是一個接口,它的執行個體可以寫入
Parcel
或從
Parcel
恢複。實作
Parcelable
的類必須要有一個實作了
Parcelable.Creator
接口的類型的非空靜态字段
CREATOR
,這個字段是幫忙從一個
Parcel
産生一個
Parcelable
類的執行個體。
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();
}
}
- describeContents()用于描述
類執行個體的Parcelable
- writeToParcel(Parcel dest, int flags)用于将資料扁平化寫入
Parcel
Parcel
是一個消息(資料或對象引用)容器,它可以通過
IBinder
來發送,也就是說
Parcelable
執行個體十分合适作來程序間通信的消息載體。
在
java
中使用
Serializable
接口實作對象的序列化,而在android中既可以使用
Serializable
也可以使用
Parcelable
接口實作對象序列化,如果隻在記憶體操作時則傾向
Parcelable
接口,傳輸效率會更高效。
注意:
Parcelable
隻能對記憶體對象序列化,不能對需要存儲在檔案或SD等裝置進行序列化,如果需要将對象序列化存儲到檔案,實作
Serializable
接口就可以了
Serializable
是
java
提供的一個序列化接口,它是一個空接口,專門為對象提供标準的序列化和反序列化操作,用它實作類的序列化比較簡單,隻要在類聲明中實作
Serializable
接口即可。
public class User implements Serializable {
private static final long serialVersionUID = -4454266436543306544L;
private String name;
/**
* age
*/
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
由于
serialVersionUID
是用來輔助序列化和反序列化過程的,原則上序列化後的對象中
serialVersionUID
隻有和目前類的
serialVersionUID
相同才能夠正常被反序列化,也就是說序列化與反序列化的
serialVersionUID
必須相同才能夠使序列化操作成功。序列化操作的時候系統會把目前類的
serialVersionUID
寫入到序列化檔案中,當反序列化時系統會去檢測檔案中的
serialVersionUID
,判斷它是否與目前類的
serialVersionUID
一緻,如果一緻就說明序列化類的版本與目前類版本是一樣的,可以反序列化成功,否則失敗。是以強烈建議指定
serialVersionUID
,這樣的話即使微小的變化也不會導緻crash的出現,否則檔案多一個空格或類的結構有些許變化都會反序列化失敗。預設情況下,系統會根據類結構自動生成的
serialVersionUID
,是以當類稍有變化,自動生成的UID就會與之前存在檔案中的不一樣,就會反序列化失敗。是以有必要指定
serialVersionUID
,那麼系統就會盡可能地序列化。