重度拖延症患者来了- 。-
Serializable接口
类实现Serializable接口时,类的申明中指定serialVersionUID作用:序列化时会将当前类serialVersionUID写入,反序列化时会检测序列化时的serialVersionUID,看是否和当前类一致,若一致,反序列化成功。
若不手动指定serialVersionUID的值,序列化时会根据当前类的结构自动生成hash值,这样序列化反序列化时serialVersionUID一致也可以正常反序列化。
但是当不手动指定,反序列化时当前类结构发生变化,增加或删除了某些成员变量,此时当前类的hash重新计算导致当前类serialVersionUID发生变化,和序列化的数据中serialVersionUID不一致因而反序列化失败。
若手动指定serialVersionUID值,即便序列化后当前类增加或删除了某些成员变量类结构发生了变化,但serialVersionUID值不变仍能成功反序列化,程序能最大限度的恢复数据。但是某些非常规改变还是会导致失败,如改变类名、修改成员变量类型。
静态成员变量属于类不属于对象,不会参与序列化过程;用transient关键字标记的成员变量也不参与序列化过程。
Parcelable接口
Parcel内部包装了可序列化的数据,可在Binder中自由传输。Parcelable接口实现序列化过程中需要实现的功能有:序列化(writeToParcel)、反序列化(CREATOR)、内容描述(describeContents)。
Serializable、Parcelable区别
Serializable是Java中的序列化接口,使用起来开销大,序列化和反序列化过程需要大量的I/O操作;
Parcelable是Android中的序列化方式,更适合Android平台上使用,缺点是麻烦(现在AS可直接集成),但效率高;Android推荐的序列化方式,首选Parcelable;
但是将对象序列化到存储设备或对象序列化后通过网络传输,使用Parcelable也可以实现,但过程会稍显复杂,这两种情况建议使用Serializable。