在代码中implements Parcelable的作用是什么呢??
参考:https://blog.csdn.net/javazejian/article/details/52665164?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param
Parcelable是Android为我们提供的序列化的接口,Parcelable相对于Serializable的使用较为复杂一些,但是Parcelable的效率也相对较高。对比Parcelable vs Serializable
Android源码中的Parcelable
/**
* Interface for classes whose instances can be written to
* and restored from a {@link Parcel}. Classes implementing the Parcelable
* interface must also have a non-null static field called <code>CREATOR</code>
* of a type that implements the {@link Parcelable.Creator} interface.
*
* <p>A typical implementation of Parcelable is:</p>
*
* <pre></pre>
* */
* public class MyParcelable implements Parcelable {
* private int mData;
*
* //-----当前对象的内容描述,一般返回0即可-----
* public int describeContents() {
* return 0;
* }
* //-----将当前对象写入序列化结构中-----
* public void writeToParcel(Parcel out, int flags) {
* out.writeInt(mData);
* }
* //-----public static final一个都不能少,内部对象CREATOR的名称也 不能改变,必须全部大写。-----
* public static final Parcelable.Creator<MyParcelable> CREATOR
* = new Parcelable.Creator<MyParcelable>() {
*
* //实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层..从序列化后的对象中创建原始对象
* public MyParcelable createFromParcel(Parcel in) {
* return new MyParcelable(in);
* }
*
* //创建一个类型为T,长度为size的数组,供外部类反序列化本类数组使用
* public MyParcelable[] newArray(int size) {
* return new MyParcelable[size];
* }
* };
*
* private MyParcelable(Parcel in) {
* mData = in.readInt();
* }
* }
从代码可知,在序列化的过程中需要实现的功能有 序列化 和 反序列 以及 内容描述。
- writeToParcel 方法实现序列化功能,其内部是通过Parcel的一系列write方法来完成的
- CREATOR内部对象来实现反序列化,其内部是通过createFromParcel方法来创建序列化对象并通过newArray方法创建数组,最终利用Parcel的一系列read方法完成反序列化
- 最后由describeContents完成内容描述功能,改方法一般返回0,仅当对象中存在文件描述符时返回1.
可以将Parcel看作是类似于Serlizable的读写流,通过writeToParcel把对象写到流里面,再通过createFromParcel从流里读取对象,这个过程需要我们自己来实现,且写的顺序和读的顺序必须一致。