Parcel

Parcel,翻译过来是“打包”的意思。打包干什么呢?是为了序列化。

以下是对android sdk 文档的翻议:Parcel是一个容器,它主要用于存储序列化数据,然后可以通过Binder在进程间传递这些数据。Parcel可以包含原始数据类型(用各种对应的方法写入,比如writeInt(),writeFloat()等),可以包含Parcelable对象,它还包含了一个活动的IBinder对象的引用,这个引用导致另一端接收到一个指向这个IBinder的代理IBinder。

注:Parcel不是一般目的的序列化机制。这个类被设计用于高性能的IPC传输。因此不适合把Parcel写入永久化存储中,因为Parcel中的数据类型的实现的改变会导致旧版的数据不可读。

  Parcel的一坨一坨的API用于解决不同类型数据的读写。这些函数们主要有六种类型。

1. 原始类

这类方法们主要读写原始数据类型。它们是:

writeByte(byte), readByte(), writeDouble(double), readDouble(),writeFloat(float), readFloat(), writeInt(int), readInt(), writeLong(long),readLong(), writeString(String), readString().

大多数其它数据的操作都是基于这些方法。

2. 原始数组类

这类方法用于读写原始数据组成的数组。在向数组写数据时先写入数组的长度再写入数据。读数组的方法可以将数据读到已存在的数组中,也可以创建并返回一个新数组。它们是:

writeBooleanArray(boolean[]), readBooleanArray(boolean[]),createBooleanArray(),writeByteArray(byte[]), writeByteArray(byte[], int, int),readByteArray(byte[]), createByteArray(),writeCharArray(char[]),readCharArray(char[]), createCharArray() ,writeDoubleArray(double[]),readDoubleArray(double[]), createDoubleArray() ,writeFloatArray(float[]),readFloatArray(float[]), createFloatArray() ,writeIntArray(int[]),readIntArray(int[]), createIntArray() ,writeLongArray(long[]),readLongArray(long[]), createLongArray() ,writeStringArray(String[]),readStringArray(String[]), createStringArray(),writeSparseBooleanArray(SparseBooleanArray),readSparseBooleanArray().

3. Parcelable类 

Parcelable为对象从Parcel中读写自己提供了极其高效的协议。你可以使用直接的方法 writeParcelable(Parcelable, int) 和readParcelable(ClassLoader) 或 writeParcelableArray(T[],int) and readParcelableArray(ClassLoader) 进行读写。这些方法们把类的信息和数据都写入Parcel,以使将来能使用合适的类装载器重新构造类的实例。

还有一些方法提供了更高效的操作Parcelable们的途径,它们是:writeTypedArray(T[],int), writeTypedList(List), readTypedArray(T[], Parcelable.Creator) andreadTypedList(List, Parcelable.Creator)。这些方法不会写入类的信息,取而代之的是:读取时必须能知道数据属于哪个类并传入正确的Parcelable.Creator来创建对象而不是直接构造新对象。(更加高效的读写单个Parcelable对象的方法是:直接调用Parcelable.writeToParcel()和Parcelable.Creator.createFromParcel())

4. Bundles类

Bundles是一种类型安全的Map型容器,可用于存储任何不同类型的数据。它具有很多对讀写数据的性能优化,并且它的类型安全机制避免了当把它的数据封送到Parcel中时由于类型错误引起的BUG的调试的麻烦,可以使用的方法为: writeBundle(Bundle), readBundle(), and readBundle(ClassLoader)。

5. 活动对象类

Parcel的一个非同寻常的特性是读写活对象的能力。对于活动对象,它们的内容实际上并没有写入,而是仅写入了一个令牌来引用这个对象。当从Parcel中读取这个对象时,你不会获取一个新的对象实例,而是直接得到那个写入的对象。有两种活动对象可操作:

Binder对象。它是Android跨进程通讯的基础。这种对象可被写入Parcel,并在读取时你将得到原始的对象或一个代理对象(可以想象:在进程内时得到原始的对象,在进程间时得到代理对象)。可以使用的方法们是:

writeStrongBinder(IBinder), writeStrongInterface(IInterface),readStrongBinder(), writeBinderArray(IBinder[]), readBinderArray(IBinder[]),createBinderArray(), writeBinderList(List), readBinderList(List),createBinderArrayList()

FileDescriptor对象。它代表了原始的Linux文件描述符,它可以被写入Parcel并在读取时返回一个ParcelFileDescriptor对象用于操作原始的文件描述符。ParcelFileDescriptor是原始描述符的一个复制:对象和fd不同,但是都操作于同一文件流,使用同一个文件位置指针,等等。可以使用的方法是:writeFileDescriptor(FileDescriptor),readFileDescriptor()。

6. 无类型容器类

一类final方法,用于读写标准的java容器类这些方法们是:

writeArray(Object[]), readArray(ClassLoader), writeList(List),readList(List, ClassLoader), readArrayList(ClassLoader), writeMap(Map),readMap(Map, ClassLoader), writeSparseArray(SparseArray),readSparseArray(ClassLoader)。

 

转自:http://blog.csdn.net/niu_gao/article/details/6453391
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值