Android-Parcelable理解與使用(對象序列化)

parcel定義介紹: 

   android提供了一種新的類型:parcel(英文解釋:包裹,小包),本類用來封裝數據的容器,封裝後的數據可以通過Intent或IPC傳遞,除了基本類型外,只有實現了Parcelable接口的類才能放入parcel中。

    parcel一般都用在Binder通信,通過read和write方法進行客戶端與服務端的數據傳遞(通信)。
        比如:frameworks層服務端與hardware客戶端的Binder通信
                reply->writeInt32(getCardReaderSize());
                int mid = data.readInt32();
    用來存放parcel數據的是內存(RAM),而不是永遠介質(Nand等)。

    parcelable定義了把數據寫入parcel和從parcel讀出數據的接口,一個類的實例,如果需要封裝到消息中去,就必須實現這一接口,如果實現了這個接口,該類的實例就是可以“被打包”。

Parcelable的定義:

    下面我們看下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);
    }
    還有一個子接口繼承Creator,子接口只提供了一個函數,返回單個繼承類實例
    public interface ClassLoaderCreator<T> extends Creator<T> 

Parcelable的實現使用:  

    Parcelabel 的實現,需要在類中添加一個靜態成員變量 CREATOR,這個變量需要繼承 Parcelable.Creator 接口。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.zlc.provider;
 
import android.os.Parcel;
import android.os.Parcelable;
 
public class Students implements Parcelable{
    private int stu_id;
    private String stu_name;
    public Students(Parcel source){
        stu_id = source.readInt();
        stu_name = source.readString();
    }
    public int getStu_id() {
        return stu_id;
    }
    public void setStu_id(int stu_id) {
        this.stu_id = stu_id;
    }
    public String getStu_name() {
        return stu_name;
    }
    public void setStu_name(String stu_name) {
        this.stu_name = stu_name;
    }
    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub
        dest.writeInt(stu_id);
        dest.writeString(stu_name);
    }
    //Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel.
    public final static Parcelable.Creator<Students> CREATOR = new Parcelable.Creator<Students>() {
 
        @Override
        public Students createFromParcel(Parcel source) {
            // TODO Auto-generated method stub
            return new Students(source);
        }
 
        @Override
        public Students[] newArray(int size) {
            // TODO Auto-generated method stub
            return new Students[size];
        }
    };
}

Parcelable和Serializable的區別:


    android自定義對象可序列化有兩個選擇一個是Serializable和Parcelable

    一、對象爲什麼需要序列化
        1.永久性保存對象,保存對象的字節序列到本地文件。
        2.通過序列化對象在網絡中傳遞對象。
        3.通過序列化對象在進程間傳遞對象。

    二、當對象需要被序列化時如何選擇所使用的接口
        1.在使用內存的時候Parcelable比Serializable的性能高。
        2.Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC(內存回收)。
        3.Parcelable不能使用在將對象存儲在磁盤上這種情況,因爲在外界的變化下Parcelable不能很好的保證數據的持續性。

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