Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Parcelable vs Serializable

Android Parcelable vs Serializable

編輯:關於Android編程

序列化

在Android中,對象是實現序列化之前是無法直接作為Intent參數在Activity之間傳遞的。
Android中對象序列化可以通過實現Serializable接口或者實現Parcelable接口。接下來,我會介紹一下實現這兩個接口的方法以及如何在這兩者之間進行選擇。


Serializable

Serializable是一個標記接口,意味著它沒有需要實現的方法。因為對象再實現Serializable接口的時候,只需要簡單的implements即可。

示例代碼如下:

package com.example.photocrop.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class PersonSerializable implements Serializable {
    private static final long serialVersionUID = -1535959029658501338L;
    private String name;
    private String sex;
    private int age;
    private List skills = new ArrayList();

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

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

    public List getSkills() {
        return skills;
    }

    public void setSkills(List skills) {
        this.skills = skills;
    }

}

在Activity-1中傳遞PersonSerializable的代碼如下:

    private PersonSerializable generatePerson() {
        PersonSerializable ps = new PersonSerializable();
        ps.setAge(27);
        ps.setName(wangzhengyi);
        ps.setSex(boy);
        ps.setSkills(new ArrayList(Arrays.asList(c, c++, java, php)));

        return ps;
    }

    private void startActivity2() {
        PersonSerializable ps = generatePerson();
        Intent intent = new Intent(this, Activity2.class);
        intent.putExtra(person, ps);
        startActivity(intent);
    }

在activity-2中接收PersonSerializable對象:

Intent intent = getIntent();
PersonSerializable ps  = (PersonSerializable)intent.getSerializableExtra(person);
Log.e(wangzhengyi, person name : + ps.getName());
Log.e(wangzhengyi, persion age : + ps.getAge());

Parcelable

實現Parcelable接口主要需要如下幾個步驟:

實現describeContents方法。內容接口描述,默認返回0即可。 實現writeToParcel方法。傳遞數據到Parcel容器中。 創建一個Parcelable.Creator接口的實例,用於讀取Parcel容器中的數據。

示例代碼如下:

package com.example.photocrop.model;

import java.util.ArrayList;
import java.util.List;

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

public class PersonParcelable implements Parcelable{
    private String name;
    private String sex;
    private int age;
    private List skills = new ArrayList();


    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

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

    public List getSkills() {
        return skills;
    }

    public void setSkills(List skills) {
        this.skills = skills;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getName());
        dest.writeString(getSex());
        dest.writeInt(getAge());
        dest.writeList(getSkills());
    }

    public void readFromParcel(Parcel source) {
        setName(source.readString());
        setSex(source.readString());
        setAge(source.readInt());
        source.readList(skills, List.class.getClassLoader());
    }

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

        @Override
        public PersonParcelable createFromParcel(Parcel source) {
            // 從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回邏輯層。
            PersonParcelable pp = new PersonParcelable();
            pp.readFromParcel(source);
            return pp;
        }

        @Override
        public PersonParcelable[] newArray(int size) {
            // 創建一個類型為T,長度為size的數組,僅一句話(return new T[size])即可。方法是供外部類反序列化本類數組使用。
            return new PersonParcelable[size];
        }
    };
}

在activity-1中傳遞PersonParcelable對象:

    private PersonParcelable generatePerson() {
        PersonParcelable pp = new PersonParcelable();
        ps.setAge(27);
        ps.setName(wangzhengyi);
        ps.setSex(boy);
        ps.setSkills(new ArrayList(Arrays.asList(c, c++, java, php)));

        return pp;
    }

    private void startActivity2() {
        PersonParcelable pp = generatePerson();
        Intent intent = new Intent(this, Activity2.class);
        intent.putExtra(person, ps);
        startActivity(intent);
    }

在activity-2中接收PersonParcelable對象:

        Intent intent = getIntent();
        PersonParcelable pp = (PersonParcelable) intent.getParcelableExtra(person);
        Log.e(wangzhengyi, person name : + pp.getName());
        Log.e(wangzhengyi, persion age : + pp.getAge());
        for (String skill : pp.getSkills()) {
            Log.e(wangzhengyi, skill: + skill);
        }

區別

主要的區別如下:

Serializable實現簡單,不需要任何額外的序列化操作。而Parcelable實現較為復雜,有特定的接口和對象句柄需要實現。 Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC,而相比之下Parcelable的性能更高(號稱10倍優於Serializable),所以當在使用內存時(如:序列化對象在網絡中傳遞對象或序列化在進程間傳遞對象),更推薦使用Parcelable接口。 Parcelable有個明顯的缺點:不能使用在要將數據存儲在磁盤上的情況(如:永久性保存對象,保存對象的字節序列到本地文件中),因為Parcel本質上為了更好的實現對象在IPC間傳遞,並不是一個通用的序列化機制,當改變任何Parcel中數據的底層實現都可能導致之前的數據不可讀取,所以此時還是建議使用Serializable 。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved