天天看點

Android中的Serializable、Parcelable

​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​

​,那麼系統就會盡可能地序列化。