序列化:将一个对象转换成可存储或可传输的状态,序列化后的对象可以在网络上传输,也 可以存储到本地,或实现跨进程传输。
为什么要进行序列化:开发过程中,我们需要将对象的引用传给其他 activity 或 fragment 使用时,需要将这些对象放到一个 Intent 或 Bundle 中,再进行传递,而 Intent 或 Bundle 只能识别基本数据类型和被序列化的类型。
Serializable:表示将一个对象转换成可存储或可传输的状态。
Parcelable:与 Serializable 实现的效果相同,也是将一个对象转换成可传输的状态,但它的实现原理是将一个完整的对象进行分解,分解后的每一部分都是 Intent 所支持的数据类型,这样实现传递对象的功能。
Parcelable 实现序列化的重要方法:序列化功能是由 writeToParcel 完成,通过 Parcel 中的 write 方法来完成;反序列化由 CREATOR 完成,内部标明了如何创建序列化对象及数级, 通过 Parcel 的 read 方法完成;内容描述功能由 describeContents 方法完成,一般直接返回0。
区别:Serializable 在序列化时会产生大量临时变量,引起频繁 GC。Serializable 本质上使用了反射,序列化过程慢。Parcelable 不能将数据存储在磁盘上,在外界变化时,它不能很好的保证数据的持续性。
选择原则:若仅在内存中使用,如 activity/service 间传递对象,优先使用 Parcelable,它性能高。若是持久化操作,优先使用 Serializable 。
注意:静态成员变量属于类,不属于对象,固不会参与序列化的过程;用 transient 关键字编辑的成员变量不会参与序列化过程;可以通过重写 writeObject()和 readObject()方法来 重写系统默认的序列化和反序列化。
网友评论