您的位置:首页 > 移动开发 > Android开发

Android-Parcelable理解与使用(对象序列化)

2015-04-28 17:52 387 查看
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 接口。

?
Parcelable和Serializable的区别:

android自定义对象可序列化有两个选择一个是Serializable和Parcelable

一、对象为什么需要序列化

1.永久性保存对象,保存对象的字节序列到本地文件。

2.通过序列化对象在网络中传递对象。

3.通过序列化对象在进程间传递对象。

二、当对象需要被序列化时如何选择所使用的接口

1.在使用内存的时候Parcelable比Serializable的性能高。

2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。

3.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: