一、前言
对于Android开发者来说,序列化总是一个不能避免的问题。前有“使用enum实现单例模式可以自动序列化”的观点,后有“在Intent传输过程中使用Parcelable进行序列化可以减少性能损耗”的思考。
由此,我们很有必要找到应对各种场景的最佳实践。
本文中我们谈谈Serializable 和 Parcelable。
二、序列化的目的
序列化的目的是保存或传输数据,android中序列化目的具体包括:
- 将对象持久化到本地(保存在文件或者数据库中)方便下次复用。
- 序列化之后,利用数据流在网络中传输。
- 组件间传递数据。
三、序列化的手段
java中最常用的序列化标识是Serializable,定义一个Bean时实现Serializable接口,不需要实现什么方法,Serializable从源码看没有任何方法,但是注释说明很多很多。Serializable可以实现数据持久化,保存对象到本地文件、数据库、网络流传输。
Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程 序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
Serializable主要用于持久化存储对象,Parcelable主要用于序列化传输对象。
四、效率说明
原理:
Serializable由于使用了反射机制,在序列化操作的时候会产生大量的临时变量,从而导致GC的频繁调用。
Parcelable是以Ibinder作为信息载体的,内存开销较小。
特点:
在读写数据的时候,Parcelable是在内存中直接进行读写,
Serializable是通过使用IO流的形式将数据读写入在硬盘上。
侧重:
虽然Parcelable的性能要强于Serializable,但Parcelable无法将数据进行持久化,因此让要使用Serializable将数据保存在磁盘的时候。
Parcelable的性能比Serializable好,内存开销小,所以android中在内存间数据传输时推荐使用Parcelable,所以在程序内不同组件间以及不同Android程 序间(AIDL)高效的传输数据时选择Parcelable。
Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable。
使用:
Serializable实现较简单,只需要实现接口,提供SerializableID即可,如果没有序列化id,如果对象某些字段修改或添加,会导致已存储的数据无法读取。
Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何分解和组合对象(打包和解包)的工作自己来定义,而序列化的这些操作完全由底层实现。
具体使用代码网上很多,这里就不贴出了。
网友评论