天天看点

Android Serializable和Parcelable原理和使用选择1 android 中的对象序列化2 序列化手段3 原理效率简单说明

1 android 中的对象序列化

序列化的目的是保存或传输数据,android中序列化目的具体包括:

  • 将对象持久化到本地(保存在文件或者数据库中)方便下次复用。
  • 序列化之后,利用数据流在网络中传输。
  • 组件间传递数据。

2 序列化手段

java中最常用的序列化标识是Serializable,定义一个Bean时实现Serializable接口,不需要实现什么方法,Serializable从源码看没有任何方法,但是注释说明很多很多。Serializable可以实现数据持久化,保存对象到本地文件、数据库、网络流传输。

Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程 序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

Serializable主要用于持久化存储对象,Parcelable主要用于序列化传输对象。

3 原理效率简单说明

原理:

Serializable由于使用了反射机制,在序列化操作的时候会产生大量的临时变量,从而导致GC的频繁调用。

Parcelable是以Ibinder作为信息载体的,内存开销较小。

特点:

在读写数据的时候,Parcelable是在内存中直接进行读写,

Serializable是通过使用IO流的形式将数据读写入在硬盘上。

侧重:

虽然Parcelable的性能要强于Serializable,但Parcelable无法将数据进行持久化,因此让要使用Serializable将数据保存在磁盘的时候。

Parcelable的性能比Serializable好,内存开销小,所以android中在内存间数据传输时推荐使用Parcelable,祖健健传递数据。

Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable。

使用:

Serializable实现较简单,只需要实现接口,提供SerializableID即可,如果没有序列化id,如果对象某些字段修改或添加,会导致已存储的数据无法读取。

Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何分解和组合对象(打包和解包)的工作自己来定义,而序列化的这些操作完全由底层实现。

具体使用代码网上很多,这里就不贴出了。

继续阅读