在 Android 中,序列化的实体对象,实现 Parcelable 接口,支持 Intent 数据传递,进程间通信。
将 Bundle 对象数据 向 Parcel parcel 写入时,当 ArrayMap 的 value (Object) 类型是 Parcelable 。
public final void writeValue(Object v) {
if (v == null) {
writeInt(VAL_NULL);
} else if (v instanceof String) {
writeInt(VAL_STRING);
writeString((String) v);
} else if (v instanceof Integer) {
writeInt(VAL_INTEGER);
writeInt((Integer) v);
}
...
else if (v instanceof Parcelable) {
writeInt(VAL_PARCELABLE);
writeParcelable((Parcelable) v, 0);
}
...
}
对于简单类型,Parcel writeXxxx() 方法。实现 Parcelable 接口的实体类型,Parcel writeParcelable() 方法。
public final void writeParcelable(Parcelable p, int parcelableFlags) {
if (p == null) {
writeString(null);
return;
}
writeParcelableCreator(p);
p.writeToParcel(this, parcelableFlags);
}
实体类 writeToParcel() 方法,实现 Parcelable 接口,重写 writeToParcel() 方法,将每个字段写入 Parcel。
Parcelable 接口示例。
public class Book implements Parcelable {
private String bookName;
private int publishDate;
public Book() {
}
//set/get方法。
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(bookName);
out.writeInt(publishDate);
}
public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book[] newArray(int size) {
return new Book[size];
}
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
}
};
public Book(Parcel in) {
bookName = in.readString();
publishDate = in.readInt();
}
}
从 Parcel 解析数据。
内部静态对象 CREATOR,实现 Creator 接口,createFromParcel() 方法,创建Parcelable 实体对象,构造参数 Parcel,从 Parcel 提取实体类字段,赋值。
任重而道远