1.Serializable是Java的JDK提供的,由于该序列化不够丝滑,在PC等大型操作系统中使用,体验不出来,如果在Adnroid 虚拟机中,数据的传递存在一定的差异,这时,google官方提供了新的序列化对象Parcelable
Parcelable相比较Serializable要复杂的很多,Serializable序列化只要对象继承该接口,即可。但是Parcelable需要我们手动去分装
Parcelable序列化的封装
如果最外层Bean需要实现Parcelable,那么内部的变量也是一个类对象,也要实现序列化,可以先从变量类开始序列化,最后实现外层bean的序列化
序列化之前先把变量定义好,这样用助于后面序列化的操作
1.1先将当前类继承接口Parcelable
1.2将鼠标悬停在错误提示位置,这个时候IDE提示如下
1.3 我们只需要点击Add implementation Parcelable
1.4IDE会自动完成组装,自动读写变量
结果如下:
public class MyParcelBean implements Parcelable { private int age; private String name; private boolean sex; protected MyParcelBean(Parcel in) { age = in.readInt(); name = in.readString(); sex = in.readByte() != 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(age); dest.writeString(name); dest.writeByte((byte) (sex ? 1 : 0)); } @Override public int describeContents() { return 0; } public static final CreatorCREATOR = new Creator () { @Override public MyParcelBean createFromParcel(Parcel in) { return new MyParcelBean(in); } @Override public MyParcelBean[] newArray(int size) { return new MyParcelBean[size]; } }; }
**************************************************************************************************
手动封装我们需要知道,处理哪些东西,这些东西是什么。流程是什么
同样已MyParcelBean类为例,
2.1.类的变量定义好了,然后继承接口Parcelable
2.2.重写以下方法
@Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(age); dest.writeString(name); dest.writeByte((byte) (sex ? 1 : 0)); }
writeToParcel是我们需要处理的地方,这边提供了两个参数:Parcel 和flags
Parcel :是变量的封装,
flags:是标识
接下来我们重点讲解Parcel
1.Parcel 主要提供数据的读写,如果你是什么类型,在读写过程就用什么类型,但是boolean除外,
2.boolean类型再Parcel中,没有该类型,通过通过byte类型替代
3.读写的顺序必须对应,如下:
dest.writeInt(age); dest.writeString(name); dest.writeByte((byte) (sex ? 1 : 0));
存的顺序是这样,那么读的顺序也一定要这样,否则数据会异常
protected MyParaceBean(Parcel in) { age = in.readInt(); name = in.readString(); sex = in.readByte() != 0; }
3.每个parcelable接口都有一个造物者,我们还要实现这个固定写法:
public static final CreatorCREATOR = new Creator () { @Override public MyParaceBean createFromParcel(Parcel in) { return new MyParaceBean(in); } @Override public MyParaceBean[] newArray(int size) { return new MyParaceBean[size]; } };
这是固定写法
4.我们需要实现一个保护类型的构造器,用来读在这数据
protected MyParaceBean(Parcel in) { age = in.readInt(); name = in.readString(); sex = in.readByte() != 0; }
如果保存一个对象,这个对象必须也要实现parcelable接口
在Bean中
private MyParaceBeanChild child;
写:
dest.writeParcelable(child, flags);
读:
child = in.readParcelable(MyParaceBeanChild.class.getClassLoader());
List的数据保存,也是需要在List泛型对象中先实现parcelable的接口,
在Bena中定义如下:
private Listlist;
写:
dest.writeTypedList(list);
读:
list = in.createTypedArrayList(MyParaceBeanChild.CREATOR);
类型不支持,通过byte来复写,可以参考上面boolean说法
一般在读写类型中,Parcel数据封装提供了对应的绝大多数类型。
核心点:
protected MyParaceBean(Parcel in) { }
@Override
public void writeToParcel(Parcel dest, int flags) { }
public static final CreatorCREATOR = new Creator () { @Override public MyParaceBean createFromParcel(Parcel in) { return new MyParaceBean(in); } @Override public MyParaceBean[] newArray(int size) { return new MyParaceBean[size]; } };
只需要处理好这三个地方,其他都是自己的Java逻辑。