Android数据对象序列化原理与应用( 三 )


(1) Serializable:

  • Serializable是Java提供的默认序列化机制 , 通过实现Serializable接口,可以将对象转换为字节流,以便在网络传输或保存到文件中 。
  • Serializable使用反射机制 , 将对象的状态保存到字节流中,然后再从字节流中恢复对象的状态 。这种方式相对简单,但效率较低 。
  • Serializable的缺点是序列化和反序列化的过程需要大量的I/O操作,对性能要求较高的场景下可能会影响程序的执行效率 。
(2) Parcelable:
  • Parcelable是Android提供的专门用于Android平台的序列化机制,通过实现Parcelable接口,可以将对象转换为字节流 , 以便在Activity之间传递 。
  • Parcelable使用了更加高效的序列化方式,将对象的状态拆分为多个字段,分别写入和读取字节流 。这种方式相对复杂 , 但效率较高 。
  • Parcelable的优点是序列化和反序列化的过程更加高效,对性能要求较高的场景下可以提升程序的执行效率 。
Serializable适用于简单的序列化场景,而Parcelable适用于对性能要求较高的Android平台 。在选择使用Serializable还是Parcelable时,需要根据具体的需求和性能要求进行权衡 。
Android数据对象序列化原理与应用

文章插图
数据来自parcelable-vs-serializable , 实验结果对比Parcelable的效率比Serializable快10倍以上 。
总结 对比
Serializable
Parcelable
所属API
Java API
Android SDK API
特点
序列化和反序列化会经过大量的I/O操作,产生大量的临时变量引起GC,且反序列化时需要反射
基于内存拷贝实现的封装和解封(marshalled& unmarshalled),序列化基于Native层实现
开销
相对高
相对低
效率
相对低
相对高
适用场景
简单序列化
Android
在使用「Serializable」进行对象的序列化时,有一些注意点需要注意:
  • 类的定义:被序列化的类需要实现Serializable接口,这是Java提供的一个标记接口,用于表示该类可以被序列化 。如果一个类没有实现Serializable接口,那么在进行序列化时会抛出NotSerializableException异常 。
  • 成员变量的序列化:被序列化的类的所有成员变量都会被序列化,包括私有成员变量 。但是,如果某个成员变量不希望被序列化,可以使用transient关键字进行修饰,被修饰的成员变量在序列化过程中会被忽略 。
  • 对象引用的序列化:如果一个类中包含其他对象的引用,那么在序列化时 , 被引用的对象也会被序列化 。但是,如果被引用的对象没有实现Serializable接口,那么在序列化时会抛出NotSerializableException异常 。为了解决这个问题,可以将被引用的对象设置为transient,或者让被引用的对象也实现Serializable接口 。
  • 序列化版本号:在进行对象的序列化时,会为每个被序列化的类自动生成一个序列化版本号 。这个版本号用于在反序列化时判断序列化的类和反序列化的类是否兼容 。如果序列化的类和反序列化的类的版本号不一致 , 会抛出InvalidClassException异常 。为了避免这个问题,可以显式地为类指定一个固定的序列化版本号,可以使用serialVersionUID关键字进行指定 。
  • 序列化的安全性:在进行对象的序列化时,需要注意序列化的安全性 。因为序列化的数据可以被反序列化成对象,如果序列化的数据被篡改,可能会导致安全漏洞 。为了增强序列化的安全性 , 可以使用加密算法对序列化的数据进行加密,或者对序列化的类进行签名验证 。
在使用「Parcelable」进行序列化时 , 有几个注意点需要注意: