关于序列化

学习目标

关于序列化的知识

  1. Parcelable和Serializable有什么用,它们有什么差别?

  2. 自定义一个类让其实现Parcelable,大致流程是什么?

Parcelable和Serializable有什么用,它们有什么差别?

Parcelable和Serializable都可以实现序列化,使对象可以变成二进制流在内存中传输数据。在Android中,只要实现了二者之一的类就可以使用Intent和Binder来传递数据。实现了Parcelable接口的类依赖Parcel这个类来实现数据的传递,它并不是一个一般用途的序列化机制,主要用于IPC机制的高性能传输。

差别:

  1. 从来源上看:Parcelable是Android中提供的序列化接口,Serializable是Java提供的序列化接口。因此Parcelable只能在Android中使用,而Serializable可以在任何使用Java语言的地方使用。
  2. 从使用上看,Parcelable使用的比较麻烦,序列化过程需要实现Parcelable的writetoParcel(Parcel dest,int flags)方法和describeContents()方法。为了反序列化,还需要提供一个叫做CREATOR的非空静态字段,该字段类型是实现了Parcel.Creator接口的类,一般用一个匿名内部类实现就可以了。有一些插件可以方便实现Parcelable接口。

    Serializable的使用比较简单,直接实现Serializable接口就行了,该接口没有任何方法,序列化机制是提供一个long型的serialVersionUID,如果没有显示的指定,该序列化运行时,会基于该类的结构自动计算一个值。如果该类的结构发生变化,就会导致自动计算的serialVersionUID不同。这样会导致一个问题,序列化之后类如果新增了一个字段,反序列过程就会失败,一般会报InvaliClassException这样的异常,如:
    invalidException
    如果显示的指定了serialVersionUID,只要类的结果不发生重大变化,如更改类型,字段类型发生变化等,只添加或者删除字段等都是可以反序列化成功的。

  3. 从效率上看,Serializable的序列化和反序列化需要使用到IO操作,而Parcelable不需要,所以Parcelable的效率要高于Serializable,Android中推荐Parcelable。

注意:如果需要将对象持久化到存储设备或者通过网络传输到其他设备,最好使用Serializable。

自定义一个类让其实现Parcelable,大致流程是什么?

自定义一个类让其实现Parcelable,大致流程是先实现该接口的writetoParcel(Parcel dest,int flags)方法和describeContents()方法,然后添加一个Parcel.Creator类型的名为CREATOR的非空静态字段。该类中字段如果有其他的自定义类型,其它的自定义类型也需要实现Parcelable或者Serializable接口。例如:
invalidException