8. Parcelable和Serializable
除了传递基本类型外,传递自定义的对象需要实现Parcelable或者Serializable接口。
区别
两种都是用于支持序列化、反序列化话操作。
- 两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。
- Serializalbe会使用反射,序列化和反序列化过程需要大量I/O操作,Parcelable自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在Native内存中,效率要快很多。
Pacelable 和 Serializable 序列化的作用是不同的,Pacelable 是为了“传递”,而 Serializable 是为了“储存”。另外 Serializable 之所以慢,是由于为了读取对象中的成员变量而使用的大量的反射,而 Pacelable 的读写都是自己实现的。还有 Serializable 也是可以自己设置不想要序列化的属性的,只需要在该变量前加一个 transient 关键字(static 标记的属性也是不能序列化的,但是 static final 的可以)。
效率及选择
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化.
Parcelable和Parcle这两者之间的关系?
Parcelable 接口定义在封送/解封送过程中混合和分解对象的契约。Parcelable接口的底层是Parcel容器对象。
Parcel类是一种最快的序列化/反序列化机制,专为Android中的进程间通信而设计。该类提供了一些方法来将成员容纳到容器中,以及从容器展开成员。
在两个Activity之前传递对象还要注意什么呢?
一定要要注意对象的大小,Intent中的Bundle是在使用Binder机制进行数据传递的,能使用的Binder的缓冲区是有大小限制的(有些手机是2M),而一个进程默认有16个binder线程,所以一个线程能占用的缓冲区就更小了(以前做过测试,大约一个线程可以占用128KB)。所以当你看到“The Binder transaction failed because it was too large.”这类TransactionTooLargeException异常时,你应该知道怎么解决了。
binder不是用来跨进程通信的吗?为什么activity间传递bundle要使用binder?
很多Activity并不是在一个进程中,比如你从自己的应用通过Intent打开一个发Email的Activity,你要往这样Activity传一些诸如收件人、主题等信息吧。这样一想Intent的传递肯定就是要跨进程的了.