Android序列化之Serial库
什么是Serial
Serial是由Twitter高性能序列化方案,它力求帮助开发者实现高性能和高可控的序列化过程。
GitHub:https://github.com/twitter/Serial/blob/master/README-CHINESE.rst/
Serializable与Parcelable的优劣
Serializable
Java原生的序列化机制,在Android源码中也广泛使用。具体使用方案在这里不进行过多说明。Serializable在序列化过程中大量使用反射技术以及申请临时变量,因此序列化性能会比较差,另一方面,序列化后的文件信息非常多,影响IO读写性能。但是Serializable使用起来非常简单,除此之外,可以通过readObject和writeObject进行自定义序列化,例如实现加密。
Parcelable
由于Java原生序列化机制性能很低,因此Google提供了一个更加轻量高效的方案Parcelable。Parcelable性能非常优秀,Parcelable不需要采用反射的方式去实现序列化和反序列化,但换来的代价是需要对写入和读取手动添加代码,因此实现复杂。除此之外,还要考虑系统版本的兼容性和数据前后的兼容性。厂商或者Android版本的更新如果对Parcel进行修改可能导致问题,除此之外,Parcelable并没有Serializable一样优秀的版本管理,因此带来很大的维护成本。对于需要持久化存储,更偏向使用Java原生的Serializable。
Serial的优点
- 相比起传统的反射序列化方案更加高效(没有使用反射),性能相比传统方案提升了3倍(序列化的速度提升了5倍,反序列化提升了2.5倍),序列化生成的数据量大约是之前的1/5。
- 开发者对于序列化过程的控制较强,可定义哪些object、field需要被序列化。
- 有很强的debug能力,可以调试序列化的过程。
Serial的使用
依赖
从Maven Central上下载最新的依赖:
repositories {
mavenCentral()
}
dependencies {
compile 'com.twitter.serial:serial:0.1.6'
}
使用
- 定义一个需要序列化的类,序列化类必须包含的信息有一个SERIALIZER的静态变量,通过它对对象进行序列化和反序列化。这个SERIALIZER是继承 ObjectSerializer的类的实例对象,它重载了两个抽象函数,serializeObject和deserializeObject,实际通过这两个函数定义对象如何序列化和反序列化的。
public class People {
// 需要单独定义一个序列化操作相关的变量
public sta