0
点赞
收藏
分享

微信扫一扫

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


不同 ​​Activity​​​ 之间传输数据可以通过 ​​Intent​​​ 对象的 ​​putExtra​​​ 方法传递,对于 ​​java​​​ 的八大基本数据类型(char int float double long short boolean byte)传递是没有问题的,但是如果传递比较复杂的对象类型(比如对象,比如集合等),那么就可能存在问题,就需要实现数据对象数据序列化, 将这些对象放到一个 ​​Intent​​​ 或者 ​​Bundle​​ 里面,然后再传递。

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 两种序列化的使用

​​两种序列化的使用​​

​​Android:两种序列化方式 Serializable 和 Parcelable​​

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

​Serializable​​​ 的使用比较简单,创建一个版本号即可;而 ​​Parcelable​​ 则相对复杂一些,会有四个方法需要实现。

  • 一般在保存数据到 SD 卡或者网络传输时建议使用​​Serializable​​ 即可,虽然效率差一些,好在使用方便。
  • 而在运行时数据传递时建议使用​​Parcelable​​​,比如​​Intent​​​,​​Bundle​​​ 等,​​Android​​ 底层做了优化处理,效率很高。

4. 原因

​Intent​​​ 可以算是四大组件之间的胶水,比如在 ​​Activity1​​​ 与 ​​Activity2​​ 之间传递对象的时候,必须要将对象序列化,可是为什么要将对象序列化呢?

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

​Intent​​​ 在启动其他组件时,会离开当前应用程序进程,进入 ​​ActivityManagerService​​​ 进程 – ​​intent.prepareToLeaveProcess()​​​。 这也就意味着,​​Intent​​ 所携带的数据要能够在不同进程间传输。

首先我们知道,​​Android​​​ 是基于 ​​Linux​​​ 系统,不同进程之间的 ​​java​​​ 对象是无法传输,所以我们此处要对对象进行序列化,从而实现对象在 ​​应用程序进程​​​ 和 ​​ActivityManagerService​​ 进程 之间传输。


举报

相关推荐

0 条评论