笔者在进行页面跳转时,要传递一个实体类,但是这个实体类有一个bitmap属性,在传递这个对象时报错,查询资料之后发现需要对实体类进行序列化。实现序列化有以下两种方法:
- 第一个是使用Serializable接口,这个接口是Java SE本身就支持的序列化接口,但是使用这个接口来进行Intent数据的传递有一个缺点。因为这个序列化和反序列化过程中需要大量I/O操作,从而导致开销大效率低。
- 第二个是使用Parcelable接口的使用,也就是本篇文章的主要重点。这种方式是Android中支持的序列化方式,使用起来稍微麻烦点,但是效率更高,所以我们一般使用这个方式来通过Intent传递数据。
第一种方式只需要在类后面加上implements Serializable即可,但是笔者在实现过程中发现只能解决一小部分问题,还是第二种方法更好实现。
这里的各种类型比较全,可以做相对参考。下面贴上代码:
public class Worker implements Parcelable {
public String name;
public int age;
public Programmer programmer;
public ArrayList<Programmer> pros = new ArrayList<Programmer>();
public Bitmap icon;
public Designer designer;
public Worker() {}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeString(name);
out.writeInt(age);
out.writeParcelable(programmer, flags);
out.writeList(pros);
out.writeParcelable(icon, flags);
out.writeSerializable(designer);
}
public static final Parcelable.Creator<Worker> CREATOR
= new Parcelable.Creator<Worker>() {
public Worker createFromParcel(Parcel in) {
return new Worker(in);
}
public Worker[] newArray(int size) {
return new Worker[size];
}
};
private Worker(Parcel in) {
name = in.readString();
age = in.readInt();
programmer = in.readParcelable(Programmer.class.getClassLoader()); // 这个地方的ClassLoader不能为null
pros = in.readArrayList(Programmer.class.getClassLoader()); // 这个地方的ClassLoader不能为null
icon = in.readParcelable(null); // 这个地方可以为null
designer = (Designer) in.readSerializable();
}
}