Android 開發的時候,在對數據進行持久化的時候,或者數據傳遞的時候會用到序列化,這時候可以對當前數據類實現Serializable或者Parcelable接口。尤其是進程間通信時,傳遞數據需要對對象進行序列化。
序列化
- 序列化指的是將一個實例對象編碼成字節流,并從字節流編碼中重新構建對象實例的能力。將一個對象編碼成字節流,稱為序列化;從一個字節流中讀出一個對象實例,稱為反序列化。
使用場景
- 1.持久化存儲對象
- 2.序列化對象在網絡中傳輸
- 3.Bundle傳輸對象
- 4.進程間參傳遞對象(Parcelable)
Serializable和Parcelable 區別
-
Serializable
- Java自帶
- 使用簡單、代碼量少,實現接口即可
- 效率相較Parcelable低
- 序列化時,產生大量臨時變量,引起頻繁GC
-
Parcelable
- Android 專用
- 使用稍復雜,代碼量相較而言多點,需要重寫相關序列化方法
- 性能比Serializable高十倍以上
- 對序列化完整對象進行拆解,每一部分都是Intent支持的類型。
使用
- Serializable 只需要添加 serialVersionUID即可。也可以不添加,但是由于在修改序列化類后,反序列話檢查到serialVersionUID與運行時生成serialVersionUID不一致變會報錯:InvalidClassException。規范推薦添加serialVersionUID。
public class UserModel implements Serializable{
private static final long serialVersionUID = 123456789L;
public String userName;
public int userId;
public UserModel(String userName, int userId) {
this.userName = userName;
this.userId = userId;
}
}
- Parcelable
public class UserModel implements Parcelable {
private String name;
private int id;
public UserModel(String name, int id) {
this.name = name;
this.id = id;
}
/**
* 序列化
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(id);
}
@Override
public int describeContents() {
// 大都返回0即可
return 0;
}
/**
* 反序列化
*/
public static final Creator<UserModel> CREATOR = new Creator<UserModel>() {
@Override
public UserModel createFromParcel(Parcel in) {
// 反序列對象
return new UserModel(in);
}
@Override
public UserModel[] newArray(int size) {
// 反序列數組
return new UserModel[size];
}
};
/**
* 使用反序列化得到的 Parcel 構造對象
*/
protected UserModel(Parcel in) {
name = in.readString();
id = in.readInt();
}
}
總結
- 在常見的Model序列化需要持久存儲用Serializable,操作簡單,上手快,工作效率提高。
- 在Bundle傳遞對象和進程間通訊的情況下使用Parcelable(內存間的傳遞),性能至上。