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

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];
		}
	};
}

Parcelable和Serializable的區別:


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

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

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

相關文章
相關標籤/搜索