Android中使用Serializable和Parcelable實現序列化詳解(含實例)

Android中實現序列化有兩種方式,一種是使用Serializable另一種就是Parcelable了。

Serializable本身就是JavaSE支持的,Parcelable是Android特有的,效率比Serializable高,據統計一般情況下能快10倍左右!但是Parcelable不能用在需要數據永久儲存的情況,比如存到本地文件中,Parcelable不能保證在外界有變化的時候數據的持續性。本文分別對這兩種方法結合示例進行講解。

新建兩個Activity,一個是MainActivity,一個是ReceiveObjectActivity,我們把Person對象從MainActivity中傳送到ReceiveObjectActivity。

Serializable

Person
import java.io.Serializable;

/**
 * Created by SparkYuan on 10/12/2015.
 */
public class Person implements Serializable {

    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = 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;
    }
}

MainActivity中添加一個按鈕sendObjectBtn,重寫其setOnClickListener方法

 sendObjectBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Person person = new Person("Spark",23);
                Intent intent = new Intent(getApplicationContext(),ReceiveObjectActivity.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable("person",person);
                intent.putExtra("bundle",bundle);
                startActivity(intent);
            }
        });

ReceiveObjectActivity的onCreate()方法中

Intent intent = getIntent();
Person person = (Person)intent.getBundleExtra("bundle").getSerializable("person");
Log.d("Debug",person.getName());

運行結果



Parcelable

Person
import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by Daniel on 10/12/2015.
 */
public class Person implements Parcelable {


    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = 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 int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

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

        @Override
        //實現從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回
        public Person createFromParcel(Parcel source) {
            return new Person(source.readString(),source.readInt());
        }

        @Override
        //供外部類反序列化本類數組使用
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

}

注:實現Parcelable的過程有些麻煩,下面逐一講解。
(1)  public int describeContents()
內容描述,返回0就可以。
(2) public void writeToParcel(Parcel dest, int flags)
把Person對象轉化成Parcel對象,dest是目標Parcel,flags標誌object是如何被寫的。0或者PARCELABLE_WRITE_RETURN_VALUE。
(3) public static final Parcelable.Creator<T> CREATOR
createFromParcel將Parcel映射成Person對象(Parcelable對象)


在MainActivity中添加一個按鈕sendObjectBtn,重寫其setOnClickListener方法

sendObjectBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Person person = new Person("Spark",23);
                Intent intent = new Intent(getApplicationContext(),ReceiveObjectActivity.class);
                Bundle bundle = new Bundle();
                bundle.putParcelable("person",person);
//                bundle.putSerializable("person",person);
                intent.putExtra("bundle",bundle);
                startActivity(intent);
            }
        });

ReceiveObjectActivity的onCreate()方法中

Intent intent = getIntent();
Person person = (Person)intent.getBundleExtra("bundle").getParcelable("person");
Log.d("Debug",person.getName());

運行結果




發佈了58 篇原創文章 · 獲贊 26 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章