雪落的小屋

Parcelable和Serializable的区别和比较

2022-11-15学习笔记Android编程

先前学习了 Fragment ,多个 Fragment 传递数据的话,如果有很复杂的对象的时候就不方便用 IntentputExtra 了,这个时候用 Parcelable 将对象进行序列化就方便很多。

Parcelable 概要

ParcelableSerializable 都是实现序列化并且都可以用于 Intent 间传递数据,

Serializable 是 Java 的实现方式,可能会频繁的IO操作,所以消耗比较大,但是实现方式简单。

ParcelableAndroid 提供的方式,效率比较高,但是实现起来复杂一些 ,

二者的选取规则是:

内存序列化上选择 Parcelable

存储到设备或者网络传输上选择 Serializable(当然Parcelable 也可以但是稍显复杂)

选择序列化方法的原则

1、 在使用内存的时候,ParcelableSerializable 性能高,所以推荐使用 Parcelable

2、Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3、Parcelable 不能使用在要将数据存储在磁盘上的情况,因为 Parcelable 不能很好的保证数据的持续性在外界有变化的情况下。尽管 Serializable 效率低点,但此时还是建议使用Serializable

下面介绍下 ParcelableSerializable 的作用、效率、区别及选择。

作用及区别

Serializable 的作用是为了保存对象的属性到本地文件、数据库、网络流以方便数据传输,

当然这种传输可以是程序内的也可以是两个程序间的。

而Android的 Parcelable 的设计初衷是因为 Serializable 效率过慢,

为了在程序内不同组件间以及不同 Android 程序间 (AIDL) 高效的传输数据而设计,

这些数据仅在内存中存在,Parcelable是通过 IBinder 通信的消息的载体。

从上面的设计上我们就可以看出优劣了。

效率及选择

Parcelable 的性能比 Serializable 好,在内存开销方面较小,所以在内存间数据传输时推荐使用 Parcelable

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

因为 Android 不同版本 Parcelae 可能不同,所以不推荐使用 Parcelable 进行数据持久化。

编程实现上

对于 Serializable,类只需要实现 Serializable 接口,

并提供一个序列化版本id(serialVersionUID) 即可。

Parcelable 则需要实现 writeToParceldescribeContents 函数以及静态的 CREATOR 变量,

实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

高级功能上

Serializable序列化不保存静态变量,

可以使用Transient关键字对部分字段不进行序列化,

也可以覆盖writeObjectreadObject方法以实现序列化过程自定义。