1. 程式人生 > >淺談Android中Serializable和Parcelable使用區別

淺談Android中Serializable和Parcelable使用區別

Android中序列化有兩種方式:Serializable以及Parcelable。其中Serializable是Java自帶的,而Parcelable是安卓專有的。

一、Serializable序列化

serializable使用比較簡單,只需要對某個類實現Serializable 介面即可。

Serializable 介面是一種標識介面,某個類實現Serializable 介面,Java便會對這個物件進行序列化操作。

我們編寫Person類:

public class Person implements Serializable {

    private static
final long serialVersionUID = -3139325922167935911L; // private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; }
public void setName(String name) { this.name = name; } }

很簡單吧,無需過多解釋。接下來我們就將這個類從一個Acticity傳遞到另一個Activity。

MainActivity:

public class MainActivity extends Activity {

    //
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
// Person p = new Person(); p.setAge(18); p.setName("wanglei"); // Intent i = new Intent(this, SecondActivity.class); i.putExtra("person", p); startActivity(i); } }

 

 SecondActivity:

public class SecondActivity extends Activity {

    //

    private static final String TAG = "WL";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = getIntent();
        Person p=(Person) intent.getSerializableExtra("person");
        
        Log.i(TAG, "age = "+p.getAge());
        Log.i(TAG, "name = "+p.getName());
    }
}

以上程式碼及其簡單了就不解釋了,執行程式會看到如下列印:

以上就是Serializable方式序列化物件的舉例,真的很簡單,沒有什麼多餘要解釋的。

 

二、Parcelable序列化

arcel 在英文中有兩個意思,其一是名詞,為包裹,小包的意思; 其二為動詞,意為打包,扎包。郵寄快遞中的包裹也用的是這個詞。Android採用這個詞來表示封裝訊息資料。這個是通過IBinder通訊的訊息的載 體。需要明確的是Parcel用來存放資料的是記憶體(RAM),而不是永久性介質(Nand等)。

Parcelable,定義了將資料寫入Parcel,和從Parcel中讀出的介面。一個實體(用類來表示),如果需要封裝到訊息中去,就必須實現這一介面,實現了這一介面,該實體就成為“可打包的”了。

 

關與Parcelable方式實現序列化會比Serializable 方法麻煩一些,大體步驟如下:

1. 實現Parcelable介面
2. 覆寫describeContents方法,預設返回0。
3. 覆寫writeToParcel(Parcel dest, int flags)方法,指定寫入Parcel類的資料。
4. 建立Parcelable.Creator靜態物件,覆寫方法createFromParcel(Parcel in)與newArray(int size)。

 

介面的定義如下:

public interface Parcelable {
    //內容描述介面,基本不用管
    public int describeContents();
    //寫入介面函式,打包
    public void writeToParcel(Parcel dest, int flags);
     //讀取介面,目的是要從Parcel中構造一個實現了Parcelable的類的例項處理。因為實現類在這裡還是不可知的,所以需要用到模板的方式,繼承類名通過模板引數傳入。
    //為了能夠實現模板引數的傳入,這裡定義Creator嵌入介面,內含兩個介面函式分別返回單個和多個繼承類例項。
    public interface Creator<T> {
           public T createFromParcel(Parcel source);
           public T[] newArray(int size);
    }
}

下面定義了一個簡單類People, 他需要把自身的資料,打入包中。 同時在訊息的接收方需要通過People實現的Parcelable介面,將People重新構造出來。

People.java
public class People implements Parcelable {
    private String name = null;
    private int age = 0;
    private int sex = 0;// 0代表男、1代表女

    public People() {
        super();
    }

    public People(String name, int age, int sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

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

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

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

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

        @Override
        public People createFromParcel(Parcel source) {
            return new People(source.readString(), source.readInt(),
                    source.readInt());
        }
    };
}

 

傳遞People

//傳送 MainActivity.java
People people = new People();
people.setName("張三");
people.setSex(Integer.parseInt(0));
people.setAge(Integer.parseInt(25));
Intent intent = new Intent(MainActivity.this, ShowActivity.class);
Bundle b = new Bundle();
b.putParcelable("people", people);
intent.putExtras(b);
MainActivity.this.startActivity(intent);

//接受 ShowActivity.java
if(getIntent().getExtras().containsKey("people")){
  People people = getIntent().getExtras().getParcelable("people");
}

 

 

參考:

https://www.cnblogs.com/xingfuzzhd/p/3454227.html

https://www.cnblogs.com/leipDao/p/8022063.html