序列化Serializable 和Parcelable 的区别

序列化:将一个对象转换成可存储或可传输的状态,序列化后的对象可以在网络上传输,也可以存储到本地,或实现跨进程传输;

为什么要进行序列化:开发过程中,我们需要将对象的引用传给其他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()方法来重写系统默认的序列化和反序列化。

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