Parcelable
Parcelable是android.os.Parcelable提供的Android平台进行序列化的接口。在writeToParcel()通过底层Parcel中一些列write()方法完成序列化;在YourParcelable.CREATOR内部如何创建序列化对象和数组,通过Parcel中一些列read()方法完成反序列化;describeContents()完成内容描述功能。
使用Parcelable进行序列化流程
1. 继承Parcelable接口;
2. 覆写describeContents()、writeToParcel()方法(Implement methods);
3. 添加Parcel形参的构造函数,公有静态常量CREATOR(Add Parcelable Implementation)。
补充:Android Studio插件:Android Parcelable code generator插件。写完实体类后在Generate界面(Alt + Insert键)选择Parcelable一键生成。
Serializable
Serializable是Java提供的序列化借口,是一个空接口,依赖serialVersionUID将对象序列化到文件或其他中介,反序列化时如果类结构及serialVersionUID匹配就反序列化出对象。采用ObjectOutputStream和ObjectInputStream进行。
注意
1. 序列化前、后的对象内容完全一样,但不是同一个对象;
2. serialVersionUID不是必须指定的。系统会计算当前对象的Hash值将它赋值给serialVersionUID;
3. 如果serialVersionUID不匹配,反序列化时会crash如下异常:java.io.InvalidClassException;
扩展
1. 静态成员变量属于类,不会参与序列化过程;
2. 用transient关键字修饰的成员变量不参与序列化过程;
3. 可覆写writeObject()、readObject()改变系统默认的系列化过程;
4. 可使用此类的子类Externalizable对序列化进行自定义控制;
Parcelable和Serializable差别
1.Parcelable主要用于内存序列化,当需要序列化到存储设备或进行网络传输会相对复杂更适用Serializable;
2. 默认的Serializable使用反射消耗性能,可通过自定义writeObject()和readObject()优化性能;
注意
1. 在Android平台中Serializable在Parcel.writeValue()中将序列化到ByteArrayOutputStream内存中;
2.Serializable在writeObject()和readObject()中直接进行流的读写会绕开反射,提升性能;
3.Serializable只是人们常用磁盘序列化,它也支持其他中介进行。性能并不低。
参考文献
详细介绍Android中Parcelable的原理和使用方法
Android序列化完全解析(一)-Java Serializable 一个系列的,5*推荐