Serializable
只需實現Serializable接口,最好手動設置一個serialVersionUID
public class User implements Serializable {
private static final long serialVersionUID= 38749603244545L;
public int userId;
public String userName;
public String password;
}
注意點:
1.靜態成員變量屬於類不屬於對象,所以不參與序列化過程
2.用transient關鍵字標記的成員變量不參與序列化過程
Parcelable
實現Parcelable接口
public class User implements Parcelable {
public int userId;
public String userName;
public String pasword;
public Book book;
@Override
public int describeContents() {
//幾乎所有情況都返回0,僅在當前對象中存在文件描述符時返回1
return 0;
}
//將當前對象寫入序列化結構中
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(userId);
dest.writeString(userName);
dest.writeString(pasword);
dest.writeParcelable((Parcelable) book,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];
}
};
//從序列化後的對象中創建原始對象
protected User(Parcel in) {
userId = in.readInt();
userName = in.readString();
pasword = in.readString();
book = in.readParcelable(Thread.currentThread().getContextClassLoader());
}
}
兩者區別
區別 | Serializable | Parcelable |
---|---|---|
所屬API | JAVA API | Android SDK API |
原理 | 序列化和反序列化過程需要大量的I/O操作 | 序列化和反序列化過程不需要大量的I/O操作 |
開銷 | 開銷大 | 開銷小 |
效率 | 低 | 很高 |
使用場景 | 序列化到本地或者通過網絡傳輸 | 內存序列化 |