Android为什么不使用Serializable,而是另辟蹊径Parcelable?

💡 原文中文,约3600字,阅读约需9分钟。
📝

内容提要

Android使用Parcelable而不是Serializable进行序列化,因为Parcelable在内存中读写速度更快。Serializable是Java的推荐序列化方法,用于将对象转换为字节流以便存储或传输。序列化的作用包括数据持久化、网络传输、跨渠道通讯和分布式系统。Parcelable和Serializable的主要区别在于存储介质和速度。在选择使用Parcelable还是Serializable时,应根据内存或持久化存储的需求进行选择。

🔎

延伸解读

Parcelable 高效的核心:共享内存与免反射

Parcelable 比 Serializable 快约 10 倍,关键在于两点:一是直接在内存中读写,而 Serializable 需通过 I/O 操作硬盘;二是 Parcelable 的序列化与反序列化过程不依赖反射,而是手动实现封送和解封,数据存放在 Native 内存中。此外,Parcelable 利用共享内存思路,在 Native 层创建对象并将指针转为 long 值返回 Java 层,不同进程拿到相同数值即可访问同一对象,从而避免数据拷贝,进一步提升跨进程通信效率。

Serializable 的适用场景:持久化存储

尽管 Parcelable 在内存操作中速度优势明显,但 Serializable 并非一无是处。文章指出,Serializable 使用 I/O 读写将对象存储在硬盘上,适合需要将对象状态保存到文件或数据库的场景。当应用需要持久化数据,以便在程序关闭或重启后仍能恢复对象状态时,Serializable 是更自然的选择。因此,开发者不应盲目追求 Parcelable,而应根据数据是用于内存传递还是持久化存储来做出决策。

选择依据:内存传递用 Parcelable,持久化用 Serializable

文章明确给出了选择标准:当在内存中使用时,优先选择 Parcelable;当需要持久化存储时,则使用 Serializable。这一建议源于两者底层机制的差异——Parcelable 直接在内存中读写且无需反射,效率更高,适合 Android 中 Activity 间或跨进程通信的数据传递;而 Serializable 借助 I/O 将对象转为字节流存储到硬盘,更适合长期保存数据。理解这一区别有助于在开发中避免性能瓶颈或数据丢失风险。

❓

Q&A

为什么Android选择使用Parcelable而不是Serializable进行序列化?

因为Parcelable在内存中读写速度更快,效率更高。

Serializable和Parcelable的主要区别是什么?

主要区别在于存储媒介,Serializable使用I/O读写存储在硬盘上,而Parcelable直接在内存中读写。

序列化的作用有哪些?

序列化的作用包括数据持久化、网络传输、跨渠道通讯和分布式系统。

为什么Parcelable的速度比Serializable快10倍?

因为Parcelable使用共享内存的方式进行数据传输,不需要反射,效率更高。

在什么情况下应该使用Parcelable?

当需要在内存中使用时应选择Parcelable。

Serializable的基本使用步骤是什么?

实现Serializable接口,创建对象,使用ObjectOutputStream进行序列化,使用ObjectInputStream进行反序列化。

🏷️

标签

➡️

继续阅读