安卓里的序列化接口有两个,Serializable和Parcelable。前者使用非常简单,只需要实现该接口,后者还需要实现几个接口里的方法等。
在通过intent传递一个对象的时候,我通常让该对象类实现Serialazable,然后用bundle.putSerializable就可以了。但是要传递一个对象数组的时候,我发现bundle并没有putSerializableArray或putSerializableArrayList,而是有putParcelableArray和putParcelableArrayList,也就是说,想传递对象数组就要让对象类实现Parcelable接口。
以我的一个数据类为例:
public class AtItem implements Parcelable{
private String id,nickName,userTitle,signature;
1.首先要实现该接口的两个方法:
describeCount:内容描述,没什么用,默认返回0即可。
writeToParcel: 序列化,将对象的字段写入一个Parcel对象。也就是对象-->Parcel
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(id);
parcel.writeString(nickName);
parcel.writeString(userTitle);
parcel.writeString(signature);
}
2.根据parcel生成构造器:
生成以一个Parcel对象为参数的构造器,然后根据parcel读出数据为字段赋值,字段顺序要和上面的writeToParcel保持一致。也就是Parcel-->对象
public AtItem(Parcel p){
id=p.readString();
nickName=p.readString();
userTitle=p.readString();
signature=p.readString();
}
感觉这种根据开发者自觉统一顺序好像不太可靠啊,不过应该挺高效的。
3.持有一个Parcelable.Creator静态实例,用于反序列化(CREATOR这个变量名不能变):
public static final Parcelable.Creator<AtItem> CREATOR=new Creator<AtItem>() {
@Override
public AtItem createFromParcel(Parcel parcel) {
return new AtItem(parcel);
}
@Override
public AtItem[] newArray(int i) {
return new AtItem[i];
}
};
实现了两个方法,第一个根据parcel调用那个构造器,也就是反序列化过程,第二个是数组的反序列化过程,返回数组的index号元素即可。
过程已经很明显了,序列化:对象写入一个parcel对象。反序列化:CREATOR调用createFromParcel将parcel传递给对象的构造器生成对象。
最后,看看Intent传递和解析这个对象数组(这里我用的是向前一个活动的回传):
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("result", (ArrayList<? extends Parcelable>) listResult);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
finish();
解析:
List<AtItem> listnow=data.getExtras().getParcelableArrayList("result");