- 什么是序列化和反序列化
- 何时要用到序列化和反序列化
- 实现反序列化的方式
- Serializable 和 Parcelable 的区别
- 最大的区别:效率不同
- 使用场景不同,进程间通信用Parcelable,持久化存储用Serializable
- 使用的平台不同,Serializable是属于 Java 自带,Parcelable 是属于 Android 专用。
- Serializable使用简单,Parcelable使用较为复杂
- 如何使用
- 为什么效率不同(实现原理,本质)
什么是序列化
对象序列化是一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;从字节流创建对象的相反的过程称为反序列化。
为什么需要序列化
序列化的作用就是为了保存java的类对象的瞬时状态,并将对象转换成可存储或者可传输的状态,用于不同jvm之间进行类实例间的共享。
实现序列化的方式
- 实现Serializable接口
- 实现Parcelable接口
Serializable
Serializable是序列化的意思,是Java自带的接口,表示将一个对象转换成可存储或可传输的状态。用于保存在内存中各种对象的状态,并且可以把保存的对象状态再读出来。 序列化后的对象可以在网络上进行传输,也可以存储到本地。对于任何需要被序列化的对象,都必须要实现接口Serializable,它只是一个标识接口,本身没有任何成员,只是用来标识说明当前的实现类的对象可以被序列化。
Parcelable
Parcelable 是属于 Android 专用。不过不同于Serializable,Parcelable实现的原理是将一个完整的对象进行分解。而分解后的每一部分都是Intent所支持的数据类型。(问:Intent支持哪些数据类型) 1)永久性保存对象,保存对象的字节序列到本地文件中; 2)通过序列化对象在网络中传递对象; 3)通过序列化在进程间传递对象
二者的比较
Serializable代码量少,写起来方便 Parcelable代码多一些,略复杂 如果是仅仅在内存中使用,比如activity、service之间进行对象的传递,强烈推荐使用Parcelable,因为Parcelable比Serializable性能高很多。因为Serializable在序列化的时候会产生大量的临时变量, 从而引起频繁的GC。 如果是持久化操作,推荐Serializable,虽然Serializable效率比较低,但是还是要选择它,因为在外界有变化的情况下,Parcelable不能很好的保存数据的持续性。 Serializable的本质是使用了反射,序列化的过程比较慢,这种机制在序列化的时候会创建很多临时的对象,会引起频繁的GC、 Parcelable方式的本质是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的类型,这样就实现了传递对象的功能了。 为什么Parcelable比Serializable快,有人认为是因为Serializable将数据持久化在硬盘,而Parceable是直接对内存进行操作,所以Parcelable要快,而我觉得是二者的实现原理上造成的,Serializable大量的使用了反射,而Parcelable是对对象的分解传输,自然而然要快。 Serializable和Parcelable区别Serializable 和Parcelable 的区别(Android每日面试题) - 掘金Java对象序列化底层原理源码解析WhatHowWhyOther - 腾讯云开发者社区-腾讯云