实现包含其他Parcelable的Parcelable时出现问题

pix*_*xel 7 android bundle unmarshalling parcelable classnotfoundexception

我正在实现具有另一个Parcelable insde的Parcelable类.

在OuterParcelable类中:

@Override
public void writeToParcel(Parcel dest, int flags) {
    Bundle tmp = new Bundle();

    tmp.putParcelable("innerParcelable", mParcelable);
    dest.writeBundle(tmp);
Run Code Online (Sandbox Code Playgroud)

然后:

public OuterParcelable(Parcel parcel) {
    super();

    Bundle b = parcel.readBundle();
    mParcelable = b.getParcelable("innerParcelable");
Run Code Online (Sandbox Code Playgroud)

和:

    public OuterParcelable createFromParcel(Parcel in) {
        return new OuterParcelable(in);
    }
Run Code Online (Sandbox Code Playgroud)

当我使用上面的代码重新创建对象时,我得到:

 08-18 17:13:08.566: ERROR/AndroidRuntime(15520): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: my.package.InnerParcelable
Run Code Online (Sandbox Code Playgroud)

Cam*_*mer 2

为什么要将值放入 Bundle 中?你在课堂上完全实现了parcelable吗?

可打包骨架

public MyClass(Parcel in) {
    readFromParcel(in);
}

    //
// Parcelable Implementation
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeParcelable(aParcelableClass, flags);
}

private void writeObject(Parcel dest, Object obj) {
    if (obj != null) {
        dest.writeInt(1);
        dest.writeValue(obj);
    } else {
        dest.writeInt(0);
    }
}

public void readFromParcel(Parcel in) {
    aParcelableClass = in.readParcelable(ParcelableClass.class.getClassLoader());
}

private Object readObject(Parcel in) {
    Object value = null;

    if (in.readInt() == 1) {
        value = in.readValue(null); // default classloader
    }

    return value;
}

public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() {
    @Override
    public MyClass createFromParcel(Parcel source) {
        return new MyClass(source);
    }

    @Override
    public MyClass[] newArray(int size) {
        return new MyClass[size];
    }
};
Run Code Online (Sandbox Code Playgroud)

我添加了一些东西以使空值更容易处理,但原理是相同的。您需要 @Override 项、构造函数和 Creator。

如果您要读取和写入 Parcelable,如果您指定 null 作为类加载器,则会遇到问题。