Serializable 和Parcelable 的区别

Serializable

  • 定义:SerializableJava所提供的一个序列化接口,它是一个空接口,为对象提供序列化和反序列化的操作。
  • 主要作用:为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输。
  • 使用方式:对一个对象进行序列化,只需要在其类上继承Serializable接口,并实现SerializableUID常量,而这个常量是为了保证反序列化的尽可能实现。SerializableUID会在序列化的时候保存到相关文件中,在反序列化的时候会提取出这个值和类中的SerializableUID值进行对比,如果相同的话,一般反序列化就能够成功。
  • 特殊情况:在具有Serializable值的时候,如果类发生了非常规变化,例如类名、成员变量等发生变化,还是会序列化失败。此外静态成员变量是属于类的,因此不会参与序列化过程,使用transient修饰的变量也不会参与序列化过程。
  • 序列化前后的两个对象是两个不同的对象,虽然其内的成员变量等都相同,但是在内存中时两个地址。

Parcelable

  • 定义:ParcelableAndroid提供的序列化对象的接口。
  • 主要作用:因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,通过IBinder传输的数据必须实现Parcelable序列化。
  • 使用方式:需要实现writeToParceldescribeContents函数以及静态的CREATOR变量。可以使用AS上android parcelable code generator插件一键生成序列化代码。

区别

Serializable使用较为简单,但是它并不是为Android设计的,因此开销很大,序列化和反序列化需要进行大量的I/O操作。而ParcelableAndroid提供序列化方式,虽然使用麻烦,但是效率较高,而且有插件一键生成。所以我们平时尽量使用Parcelable序列化方法。

  • 把对象序列化到存储设备或者通过网络传输建议使用Serializable方法。
  • 把对象在内存上序列化比如在Activityfragment之间传输数据建议使用Parcelable方法。

你可能感兴趣的:(Serializable 和Parcelable 的区别)