一、序列化的目的:
(1)永久的儲存對象,将對象資料儲存在檔案、磁盤或者資料庫中 。
(2)通過序列化操作将對象資料在網絡上進行傳輸 。
(3)将對象序列化之後在程序間進行傳輸。
(3)在安卓中使用 Intent 進行傳輸時候,資料類型較為複雜的需要進行序列化操作 。
二、兩者差別:
(1). 在使用記憶體的時候,Parcelable 類比 Serializable 性能高,是以推薦使用 Parcelable 類。
(2). Serializable 在序列化的時候會産生大量的臨時變量,進而引起頻繁的 GC。
(3). arcelable 不能使用在要将資料存儲在磁盤上的情況。盡管 Serializable 效率低點,但在這種情況下,還是建 議你用 Serializable.
(4). Serializable的實作,隻需要實作Serializable接口即可。這隻是給對象打了一個标記(UID),系統會自動将其序列化。而Parcelabel的實作,不僅需要實作Parcelabel接口,還需要在類中添加一個靜态成員變量CREATOR,這個變量需要實作 Parcelable.Creator 接口,并實作讀寫的抽象方法。
Serializable 用法
public class User implements Serializable {
private String name;
private String age;
public User(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
通過上述代碼中,可知Serializable序列化 之需要實作Serializable接口即可,使用比較簡單;
Parcelable 用法
public class User implements Parcelable {
public int id;
public String age;
public String name;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id);
dest.writeString(this.age);
dest.writeString(this.name);
}
public User() {
}
protected User(Parcel in) {
this.id = in.readInt();
this.age = in.readInt();
this.name = in.readString();
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
public User createFromParcel(Parcel source) {
return new User(source);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
通過代碼可看Parcelabel的實作,不僅需要實作Parcelabel接口,還需要在類中添加一個靜态成員變量CREATOR,這個變量需要實作 Parcelable.Creator 接口,并實作讀寫的抽象方法。
相關視訊推薦: