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

原文地址:http://my.oschina.net/zhoulc/blog/172163

一、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 接口。

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


四、Parcelable和Serializable的區別:


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

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

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

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