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不能很好的保证数据的持续性。

相关文章
相关标签/搜索