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