Serializable
- 定义:
Serializable
是Java
所提供的一个序列化接口,它是一个空接口,为对象提供序列化和反序列化的操作。 - 主要作用:为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输。
- 使用方式:对一个对象进行序列化,只需要在其类上继承Serializable接口,并实现
SerializableUID
常量,而这个常量是为了保证反序列化的尽可能实现。SerializableUID
会在序列化的时候保存到相关文件中,在反序列化的时候会提取出这个值和类中的SerializableUID
值进行对比,如果相同的话,一般反序列化就能够成功。 - 特殊情况:在具有
Serializable
值的时候,如果类发生了非常规变化,例如类名、成员变量等发生变化,还是会序列化失败。此外静态成员变量是属于类的,因此不会参与序列化过程,使用transient
修饰的变量也不会参与序列化过程。 - 序列化前后的两个对象是两个不同的对象,虽然其内的成员变量等都相同,但是在内存中时两个地址。
Parcelable
- 定义:
Parcelable
是Android
提供的序列化对象的接口。 - 主要作用:因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,通过IBinder传输的数据必须实现Parcelable序列化。
- 使用方式:需要实现
writeToParcel
、describeContents
函数以及静态的CREATOR
变量。可以使用AS上android parcelable code generator
插件一键生成序列化代码。
区别
Serializable
使用较为简单,但是它并不是为Android
设计的,因此开销很大,序列化和反序列化需要进行大量的I/O操作。而Parcelable
是Android
提供序列化方式,虽然使用麻烦,但是效率较高,而且有插件一键生成。所以我们平时尽量使用Parcelable
序列化方法。
- 把对象序列化到存储设备或者通过网络传输建议使用
Serializable
方法。 - 把对象在内存上序列化比如在
Activity
、fragment
之间传输数据建议使用Parcelable
方法。