這是我在Intent中傳Parcelable序列化對象list遇到的錯誤
先看看這個錯誤的關(guān)鍵詞:unmarshalling和ClassNotFoundException陵吸,BadParcelableException
Parcel: Class not found when unmarshalling: 4
java.lang.ClassNotFoundException: Invalid name
···
.BadParcelableException
找到錯誤了:implements Parcelable后需要實(shí)現(xiàn)的writeToParcel(Parcel dest, int flags) 和構(gòu)造方法如BaseModel(Parcel in)里面的實(shí)現(xiàn)順序必須一一對應(yīng)介牙,不然就會出現(xiàn)如上錯誤环础。
錯誤寫法:
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(this.inum);//順序1
dest.writeParcelable(this.objA, flags);//順序2
}
protected ABean(Parcel in) {
super(in);
this.objA = in.readParcelable(ClassA.class.getClassLoader());//順序2
this.inum = in.readInt();//順序1
}
這才是正確的寫法
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeParcelable(this.objA, flags);//順序1
dest.writeInt(this.inum);//順序2
}
protected ABean(Parcel in) {
super(in);
this.objA = in.readParcelable(ClassA.class.getClassLoader());//順序1
this.inum = in.readInt();//順序2
}
這里給個全點(diǎn)的代碼(ClassA也是要序列化的剩拢,我這就直接繼承BaseModel)谆构,寫法跟Abean一致
//放入Intent
Intent intent =new Intent();
intent.putParcelableArrayListExtra("list",list);
//取出list
ArrayList<ABean> list=getIntent().getParcelableArrayListExtra("list");
import android.annotation.SuppressLint;
import android.os.Parcel;
import android.os.Parcelable;
@SuppressLint("ParcelCreator")
public class BaseModel implements Parcelable {
@Override
public int describeContents() { return 0; }
@Override
public void writeToParcel(Parcel dest, int flags) {}
public BaseModel() {}
protected BaseModel(Parcel in) {}
}
import android.os.Parcel;
import android.os.Parcelable;
public class ABean extends BaseModel {
private ClassA objA;
private int intA;
private String strA;
private boolean boolA;
private double doubleA;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(this.inum);
dest.writeParcelable(this.objA, flags);
dest.writeString(this.code);
dest.writeByte(this.active ? (byte) 1 : (byte) 0);
dest.writeDouble(this.retailPrice);
}
protected ABean(Parcel in) {
super(in);
this.objA = in.readParcelable(ClassA.class.getClassLoader());
this.inum = in.readInt();
this.code = in.readString();
this.active = in.readByte() != 0;
this.retailPrice = in.readDouble();
}
public ABean() {
}
public static final Parcelable.Creator<ABean> CREATOR = new Parcelable.Creator<ABean>() {
@Override
public ABean createFromParcel(Parcel source) {
return new ABean(source);
}
@Override
public ABean[] newArray(int size) {
return new ABean[size];
}
};
public ClassA getObjA() {
return objA;
}
public void setObjA(ClassA objA) {
this.objA = objA;
}
public int getIntA() {
return intA;
}
public void setIntA(int intA) {
this.intA = intA;
}
public String getStrA() {
return strA;
}
public void setStrA(String strA) {
this.strA = strA;
}
public boolean isBoolA() {
return boolA;
}
public void setBoolA(boolean boolA) {
this.boolA = boolA;
}
public double getDoubleA() {
return doubleA;
}
public void setDoubleA(double doubleA) {
this.doubleA = doubleA;
}
}