Serializable和Pacerlable

使用Intent傳遞數據對象時通常有兩種實現方式,Serializable和Pacerlable。

Serializable

Serializable是序列化的意思,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化後的對象可以在網絡上進行傳輸,也可以保存在本地。序列化的方式也很簡單,只需要需要序列化的類去實現Serializable接口就行了。

public class Person implements Serializable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

傳遞的時候只需要調用intent.putExtra(key,value)就可以了,接受同樣,getIntent.getSerializableExtra(key)然後強制轉換成Person類型就可以了。

Pacerlable

不同於Serializable方式將對象進行序列化,Pacerlable方式是將一個完整的對象進行分解,分解後的每一部分都是Intent所支持的數據類型,這樣就實現傳遞對象的功能了,不過實現起來比Serializable稍微複雜一點。


public class Star implements Parcelable{

    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Star [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

    public static final Parcelable.Creator<Star> CREATOR=new Parcelable.Creator<Star>() {

        @Override
        public Star createFromParcel(Parcel source) {
            Star star=new Star();
            star.name=source.readString();
            star.age=source.readInt();
            return star;
        }

        @Override
        public Star[] newArray(int size) {
            return new Star[size];
        }
    };


}

首先實現Pacerlable接口,然後需要重寫兩個方法,describeContents和writeToPacerl兩個方法,其中describeContents方法返回0就可以,而writeToPacerl則需要調用Parcel的writeXXX方法將Star的字段一一寫入。
除此之外還需要定義一個CREATOR常量,這裏創建了Pacerlable.CREATOR接口的一個實現,並將泛型指定爲Star,然後需要重寫兩個方法,createFromPacerl和newArray方法,createFromPacerl需要創建一個對象進行返回,並且讀取剛纔讀進去的字段,注意讀取的順序和寫入的順序一定完全相同。newArray方法則十分簡單,只需要new一個Star數組並使用方法中的size作爲數組大小們進行返回就行。

使用相同的代碼傳遞Pacerlable對象,然後讀寫時使用
getIntent.getPacerlableExtra方法獲取對象。

比較

Pacerlable方法效率很高,推薦使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章