parcel定義介紹: java
android提供了一種新的類型:parcel(英文解釋:包裹,小包),本類用來封裝數據的容器,封裝後的數據能夠經過Intent或IPC傳遞,除了基本類型外,只有實現了Parcelable接口的類才能放入parcel中。 android
parcel通常都用在Binder通訊,經過read和write方法進行客戶端與服務端的數據傳遞(通訊)。
好比:frameworks層服務端與hardware客戶端的Binder通訊
reply->writeInt32(getCardReaderSize());
int mid = data.readInt32();
用來存放parcel數據的是內存(RAM),而不是永遠介質(Nand等)。 網絡
parcelable定義了把數據寫入parcel和從parcel讀出數據的接口,一個類的實例,若是須要封裝到消息中去,就必須實現這一接口,若是實現了這個接口,該類的實例就是能夠「被打包」。 ide
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的實現使用:
this
Parcelabel 的實現,須要在類中添加一個靜態成員變量 CREATOR,這個變量須要繼承 Parcelable.Creator 接口。
spa
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]; } }; }
android自定義對象可序列化有兩個選擇一個是Serializable和Parcelable
code
1、對象爲何須要序列化
1.永久性保存對象,保存對象的字節序列到本地文件。
2.經過序列化對象在網絡中傳遞對象。
3.經過序列化對象在進程間傳遞對象。
對象
2、當對象須要被序列化時如何選擇所使用的接口
1.在使用內存的時候Parcelable比Serializable的性能高。
2.Serializable在序列化的時候會產生大量的臨時變量,從而引發頻繁的GC(內存回收)。
3.Parcelable不能使用在將對象存儲在磁盤上這種狀況,由於在外界的變化下Parcelable不能很好的保證數據的持續性。