为什么 Intent 传递数据时必须序列化

741 阅读3分钟

我们都知道Intent可以传递基本数据类型以及String/CharSequence,以及他们的数组类型

如果传递自定义类型的话, 则需要实现 Parcelable(包裹化,邮包)和Serializable(序列化)类型的数据,以及它们的数组/列表数据。

但是为什么呢?

1. 什么是序列化

 序列化 Serialization – 将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 简单来说: 序列化:把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

 2. 为什么要序列化 

序列化的原因基本三种情况: 永久性保存对象,保存对象的字节序列到本地文件中; 对象在网络中传递; 对象在 IPC 间传递。

 3. Android中的两种序列化机制 

实现 Serializable 接口 实现 parcelable 接口

 3.1 两种序列化方式的区别:

 Serializeble 是 java 的序列化方式,Parcelable 是 Android 特有的序列化方式; 在使用内存的时候,Parcelable 比 Serializable 性能高,所以推荐使用 Parcelable。 Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC。 

 Parcelable 不能使用在要将数据存储在磁盘上的情况,因为 Parcelable 不能很好的保证数据的持续性在外界有变化的情况下。尽管 Serializable 效率低点, 也不提倡用,但在这种情况下,还是建议你用 Serializable。 Serializeble 序列化的方式比较简单,直接集成一个接口就好了,而 parcelable 方式比较复杂,不仅需要集成 Parcelable 接口还需要重写里面的方法。

 3.2 如何选择哪种序列化方式 

Serializable 的使用比较简单,创建一个版本号即可;而 Parcelable 则相对复杂一些,会有四个方法需要实现。 一般在保存数据到 SD 卡或者网络传输时建议使用 Serializable 即可,虽然效率差一些,好在使用方便。 而在运行时数据传递时建议使用 Parcelable,比如 Intent,Bundle 等,Android 底层做了优化处理,效率很高。

4 原因

Intent 在启动其他组件时,会离开当前应用程序进程,进入 ActivityManagerService 进程 – intent.prepareToLeaveProcess()。 这也就意味着,Intent 所携带的数据要能够在不同进程间传输。 首先我们知道,_Android 是基于 Linux 系统,不同进程之间的 java 对象是无法传输,_所以我们此处要对对象进行序列化,从而实现对象在 应用程序进程 ActivityManagerService 进程 之间传输。

同理,AIDL中传递自定义数据也要进行序列化处理

参考:为什么 Intent 传递数据时必须序列化_怪咖先森的博客-CSDN博客_数据传输为什么要序列化