NotSerializable 异常 intent.addExtra(parcelable Object)

NotSerializable exception with intent.addExtra(parcelable Object)

我正在尝试将一个包含其他对象的 ArrayList 的对象传输到 Android 中的另一个 Activity。这个想法是将它们添加到 ArrayList 并显示它们,以便可以执行相关任务。

Task ta = new Task(n, o, t, v, subList);

    Intent i = new Intent(this, ActivityList.class);
    i.putExtra("task", ta);
    startActivity(i);

这是意图。 Task 是 Parcelable,subList 是 class Subtask 的 ArrayList,也是 Parcelable。 当然,既然 ArrayList 总是实现 Serializable,那么对它们进行 Parcelling 应该不是问题吧?构造函数参数是:String、byte、byte、byte、ArrayList。字节将用作布尔值。

如果您需要,这里是任务的包裹代码:

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(taskName);
    dest.writeByte((byte) (soundCueOne ? 1 : 0));
    dest.writeByte((byte) (soundCueTwo ? 1 : 0));
    dest.writeByte((byte) (vibrCue ? 1 : 0));
    dest.writeSerializable(myList);
}

private Task(Parcel in) {
    this.taskName = in.readString();
    this.soundCueOne = in.readByte() != 0;
    this.soundCueTwo = in.readByte() != 0;
    this.vibrCue = in.readByte() != 0;
    this.myList = (ArrayList<Subtask>) in.readSerializable();
}

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Task createFromParcel(Parcel in) {
        return new Task(in);
    }

    public Task[] newArray(int size) {
        return new Task[size];
    }
};

谁能看出代码有什么问题?它显然在某个地方,甚至可能在子任务 class 中,因为一旦构建任务并尝试将其打包,模拟器就会崩溃。

如果我没看错,那么问题是您正在尝试将 ArrayList<T> 用作可序列化的,即使它不是可序列化的 - 它是可包裹的。

因此,替换

dest.writeSerializable(myList);

dest.writeTypedList(myList);

并替换

this.myList = (ArrayList<Subtask>) in.readSerializable();

this.myList = in.readTypedList(new ArrayList<Subtask>(), Subtask.CREATOR);