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);
我正在尝试将一个包含其他对象的 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);