在Android中我們推薦使用Parcelable來實現對象的序列化,只要我們實現Parcelable這個接口,一個類的對象就可以實現序列化並通過Intent和Binder傳遞,至於爲什麼稍後再做解釋。
我們先定義一個User來implements Parcelable接口:
public class User implements Parcelable {
public int userId;
public String userName;
private boolean isMale;
protected User(Parcel in) {
userId = in.readInt();
userName = in.readString();
isMale = in.readByte() != 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(userId);
dest.writeString(userName);
dest.writeByte((byte) (isMale ? 1 : 0));
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
}
我們可以看到有一個參數是Parcel的對象,Parcel內部包裝了可序列化的數據,在序列化過程中提供了序列化、反序列化、內容描述。
接下來解釋下每個函數的作用。
writeToParcel:通過Parcel提供的write方法來完成序列化功能。
CREATOR:主要提供反序列化的功能,他有兩個方法createFromParcel和newArray來標明如何創建序列化對象和數組。
describeContents:內容描述功能,通常直接返回0即可,僅當對象中存在文件的描述的時候才返回1。
Parcelable跟Serializable的區別:
Serializable是Java中提供的一個序列化接口,Parcelable是專爲Android平臺提供的序列化接口。Serializable使用起來簡單但是內存開銷大,而Parcelable使用起來麻煩但是內存開銷極其的省,從效率上Parcelable更是Android推薦的一種方式。
我們可以通過一張圖來看下內存開銷的對比
儘可能的少用Serializable 多使用Android中推薦的Parcelable接口來實現序列化。
PS:圖來自網絡!!