關於序列化的知識

半夏微涼sheila發表於2018-01-03

1、Parcelable和Serializable有什麼用,它們有什麼差別?

作用:

Serializable是Java所提供的一個序列化介面,它是一個空介面,為物件提供標準的序列化和反序列化操作。它的作用是為了儲存物件的屬性到本地檔案、資料庫、網路流、rmi以方便資料傳輸,當然這種傳輸可以是程式內的也可以是兩個程式間的。

而Android的Parcelable的設計初衷是因為Serializable效率過慢,為了在程式內不同元件間以及不同Android程式間(AIDL)高效的傳輸資料而設計,這些資料僅在記憶體中存在,Parcelable是通過IBinder通訊的訊息的載體。

區別:

1)在使用記憶體的時候,Parcelable比Serializable效能高,所以推薦使用Parcelable。 2)Serializable在序列化的時候會產生大量的臨時變數,從而引起頻繁的GC。 3)Parcelable不能使用在要將資料儲存在磁碟上的情況,因為Parcelable不能很好的保證資料的持續性在外界有變化的情況下。儘管Serializable效率低點,但此時還是建議使用Serializable 。

2、自定義一個類讓其實現Parcelable,大致流程是什麼?

自定義實體類PersonBean ,實現Parcelable介面

1).複寫writeToParcel 將物件資料序列化成一個Parcel物件(序列化之後成為Parcel物件.以便Parcel容器取出資料,其中flags標識有兩種值:0或1。為1時標識當前物件需要作為返回值返回,不能立刻釋放資源,即PARCELABLE_WRITE_RETURN_VALUE,不過幾乎所有情況都返回0)

2).複寫describeContents方法,預設值為0(返回當前物件的記憶體描述。如果含有檔案描述符,返回1 即CONTENTS_FILE_DESCRIPTOR,否則返回0,幾乎所有情況都返回0)

3).例項化靜態內部物件CREATOR,實現介面Parcelable.Creator 。

  示例:

public class PersonBean implements Parcelable {
    private String name;
    private String age;

    //從序列化後的物件中建立原始物件
    protected PersonBean(Parcel in) {
        name = in.readString();
        age = in.readString();
    }


    //將Parcel容器中的資料轉換成物件資料
    public static final Creator<PersonBean> CREATOR = new Creator<PersonBean>() {
       //從序列化後的物件中建立原始物件
       //從Parcel容器中取出資料並進行轉換
        @Override
        public PersonBean createFromParcel(Parcel in) {
            return new PersonBean(in);
        }

        //建立指定長度的原始物件陣列
        //返回物件資料的大小
        @Override
        public PersonBean[] newArray(int size) {
            return new PersonBean[size];
        }
    };

    //返回當前物件的記憶體描述。如果含有檔案描述符,返回1 即CONTENTS_FILE_DESCRIPTOR,
    //否則返回0
    //幾乎所有情況都返回0
    @Override
    public int describeContents() {
        return 0;
    }

    //將當前物件寫入序列化結構中,其中flags標識有兩種值:0或1
    //為1時標識當前物件需要作為返回值返回,不能立刻釋放資源,即PARCELABLE_WRITE_RETURN_VALUE
    //不過幾乎所有情況都返回0
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(age);

    }
}

複製程式碼

相關文章