Parcelable 遇到 IOException 写入可序列化对象 getactivity()
Posted
技术标签:
【中文标题】Parcelable 遇到 IOException 写入可序列化对象 getactivity()【英文标题】:Parcelable encountered IOException writing serializable object getactivity() 【发布时间】:2014-06-02 07:12:42 【问题描述】:所以我在 logcat 中得到了这个:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.resources.student_list.Student)
我知道这意味着我的学生类不可序列化,但它是,这是我的学生类:
import java.io.Serializable;
public class Student implements Comparable<Student>, Serializable
private static final long serialVersionUID = 1L;
private String firstName, lastName;
private DSLL<Grade> gradeList;
public Student()
firstName = "";
lastName = "";
gradeList = new DSLL<Grade>();
public String getFirstName()
return firstName;
public void setFirstName(String firstName)
this.firstName = firstName;
public String getLastName()
return lastName;
public void setLastName(String lastName)
this.lastName = lastName;
public DSLL<Grade> getGradeList()
return gradeList;
public void setGradeList(DSLL<Grade> gradeList)
this.gradeList = gradeList;
public int compareTo(Student arg0)
return this.lastName.compareTo(arg0.getLastName());
这是使用 getIntent() 方法的代码:
public void onItemClick(AdapterView<?> parent, View viewClicked, int pos,
long id)
Student clickedStudent = studentList.get(pos);
int position = pos;
Intent intent = new Intent(getActivity().getApplicationContext(), ShowStudentActivity.class);
Log.e("CINTENT","CREATED!!!");
intent.putExtra("clickedStudent",clickedStudent);
intent.putExtra("newStudentList",newStudentList);
intent.putExtra("position",position);
Log.e("putExtra","Passed");
Log.e("Start activity","passed");
startActivity(intent);
);
请帮我弄清楚这是怎么回事。
这是整个 LogCat:
04-17 16:12:28.890: E/androidRuntime(22815): FATAL EXCEPTION: main
04-17 16:12:28.890: E/AndroidRuntime(22815): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.resources.student_list.Student)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Parcel.writeSerializable(Parcel.java:1181)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Parcel.writeValue(Parcel.java:1135)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Parcel.writeMapInternal(Parcel.java:493)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Bundle.writeToParcel(Bundle.java:1612)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Parcel.writeBundle(Parcel.java:507)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.content.Intent.writeToParcel(Intent.java:6111)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1613)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1422)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.app.Activity.startActivityForResult(Activity.java:3191)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:848)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.support.v4.app.Fragment.startActivity(Fragment.java:878)
04-17 16:12:28.890: E/AndroidRuntime(22815): at com.example.student_lists.MainActivity$DummySectionFragment$2.onItemClick(MainActivity.java:477)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.widget.AdapterView.performItemClick(AdapterView.java:292)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.widget.AbsListView$1.run(AbsListView.java:3168)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Handler.handleCallback(Handler.java:605)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Handler.dispatchMessage(Handler.java:92)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Looper.loop(Looper.java:137)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.app.ActivityThread.main(ActivityThread.java:4447)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.lang.reflect.Method.invokeNative(Native Method)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.lang.reflect.Method.invoke(Method.java:511)
04-17 16:12:28.890: E/AndroidRuntime(22815): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-17 16:12:28.890: E/AndroidRuntime(22815): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-17 16:12:28.890: E/AndroidRuntime(22815): at dalvik.system.NativeStart.main(Native Method)
04-17 16:12:28.890: E/AndroidRuntime(22815): Caused by: java.io.NotSerializableException: com.resources.student_list.DSLL$DNode
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815): at android.os.Parcel.writeSerializable(Parcel.java:1176)
【问题讨论】:
使用 LogCat 检查与您的异常相关的整个 Java 堆栈跟踪。如果您不了解堆栈跟踪,请将其粘贴到此处。另外,DSLL
是什么,Grade
是什么?
DSLL(DoubleSortedLinkedList) 和 Grade 另一个我创建的类,它们也是可序列化的。
我发布了 LogCar 堆栈跟踪
不直接相关,但是......在我的例子中,我试图序列化一个在不可序列化的外部类中定义的内部类。我了解到非静态内部类包含对其外部类的引用(请参阅this question)。
另见***.com/questions/61758963/…。
【参考方案1】:
Caused by: java.io.NotSerializableException: com.resources.student_list.DSLL$DNode
您的DSLL
类似乎有一个DNode
静态内部类,而DNode
不是Serializable
。
【讨论】:
@user2896762:通常,在 Android 上,从堆栈跟踪的底部开始,一直到最后一行Caused by
。这通常会指向特定的问题。堆栈跟踪的所有其他节表示围绕跟踪底部“真实”异常的包装异常。
谢谢!!! @user2896762 和@CommonsWare 我阅读了堆栈跟踪...发现我班级中的一个对象未序列化。现在它正在工作。 Caused by: java.io.NotSerializableException:
@CommonsWare 如何使用上述代码。你能帮我吗?
Model 中的每一个内部类都必须序列化。
您指出了原因,但没有指出解决方案!我认为 Fransisco 的答案应该是公认的。【参考方案2】:
你的 OneThread 类也应该实现 Serializable。所有子类和内部子类都必须实现Serializable。
这对我有用...
【讨论】:
【参考方案3】:如果您不能使 DNode 可序列化,一个好的解决方案是将“瞬态”添加到变量中。
例子:
public static transient DNode dNode = null;
这将在使用 Intent.putExtra(...) 时忽略该变量。
【讨论】:
Java 中的transient
关键字用于指示不应序列化字段。完整答案在这里:***.com/a/910522/1306012【参考方案4】:
如果你的 POJO 包含任何其他也应该实现 Serializable 的模型
【讨论】:
【参考方案5】:对我来说,这是通过使变量与类瞬态来解决的。
之前的代码:
public class UserLocation implements Serializable
public Location lastKnownLocation;
public UserLocation()
代码后
public class UserLocation implements Serializable
public transient Location lastKnownLocation;
public UserLocation()
【讨论】:
这对我不起作用。我不能让它瞬态,因为我实际上需要代码库中其他地方的那个变量的值。 这对我有帮助。谢谢【参考方案6】:由于任何内部类或其他引用的类未实现可序列化实现,因此发生异常。所以请确保所有引用的类都必须实现可序列化的实现。
【讨论】:
【参考方案7】:当您的自定义类具有其他类的属性时会出现问题,例如“位图”。我所做的是将属性字段从“私人位图照片”更改为“私人临时位图照片”。但是,在接收器活动中我 getIntent() 之后,图像是空的。因此,我将自定义类传递给了意图,并且我从图像中创建了一个字节数组并将其单独传递给意图:
selectedItem 是我的自定义对象,getPlacePhoto 是他获取图像的方法。我之前已经设置过了,现在我只是先获取它而不是转换它并单独传递它:
Bitmap image = selectedItem.getPlacePhoto();
image.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent intent = new Intent(YourPresentActivity.this,
TheReceiverActivity.class);
intent.putExtra("selectedItem", selectedItem);
intent.putExtra("image", byteArray);
startActivity(intent);
`
然后在接收器活动中,我将我的对象和图像作为字节数组,解码图像并将其设置为我的对象作为照片属性。
Intent intent = getIntent();
selectedItem = (ListItem) intent.getSerializableExtra("selectedItem");
byte[] byteArray = getIntent().getByteArrayExtra("image");
Bitmap image = BitmapFactory.decodeByteArray(byteArray, 0,
byteArray.length);
selectedItem.setPhoto(image);
【讨论】:
【参考方案8】:需要将 bean 类中的所有 arraylist 更改为 Serializable wif :
public static class PremiumListBean implements Serializable
private List<AddOnValueBean> AddOnValue;
public List<AddOnValueBean> getAddOnValue()
return AddOnValue;
public void setAddOnValue(List<AddOnValueBean> AddOnValue)
this.AddOnValue = AddOnValue;
public static class AddOnValueBean implements Serializable
@SerializedName("Premium")
private String Premium;
public String getPremium()
return Premium;
public void setPremium(String Premium)
this.Premium = Premium;
【讨论】:
【参考方案9】:就我而言,我也必须将MainActivity
实现为Serializable
。因为我需要从我的MainActivity
启动服务:
public class MainActivity extends AppCompatActivity implements Serializable
...
musicCover = new MusicCover(); // A Serializable Object
...
sIntent = new Intent(MainActivity.this, MusicPlayerService.class);
sIntent.setAction(MusicPlayerService.ACTION_INITIALIZE_COVER);
sIntent.putExtra(MusicPlayerService.EXTRA_COVER, musicCover);
startService(sIntent);
【讨论】:
【参考方案10】:我也解决了这些错误,并且我在 modelClass 中进行了一些更改,它们实现了 Serializable 接口,例如:
在该模型类中,还使用 writeToParcel() 覆盖方法实现 Parcelable 接口
然后 "create creator" 出现错误,所以 CREATOR 是编写的,并且还使用 带有参数和不带参数的模型类构造器创建..
@Override
public void writeToParcel(Parcel dest, int flags)
dest.writeString(id);
dest.writeString(name);
protected ArtistTrackClass(Parcel in)
id = in.readString();
name = in.readString();
public ArtistTrackClass()
public static final Creator<ArtistTrackClass> CREATOR = new Creator<ArtistTrackClass>()
@Override
public ArtistTrackClass createFromParcel(Parcel in)
return new ArtistTrackClass(in);
@Override
public ArtistTrackClass[] newArray(int size)
return new ArtistTrackClass[size];
;
这里,
ArtistTrackClass -> ModelClass
具有 Parcel 参数的构造函数“读取我们的属性” 并且 writeToParcel() 是 “写入我们的属性”
【讨论】:
【参考方案11】:Grade 类也必须实现 Serializable
public class Grade implements Serializable
.....your content....
【讨论】:
【参考方案12】:我遇到了同样的问题,问题是有一些带有 static 关键字的内部类。删除 static 关键字后它开始工作,并且内部类应该实现 Serializable
问题场景
class A implements Serializable
class static B
解决者
class A implements Serializable
class B implements Serializable
【讨论】:
以上是关于Parcelable 遇到 IOException 写入可序列化对象 getactivity()的主要内容,如果未能解决你的问题,请参考以下文章
Parcelable 在写入可序列化对象时遇到 IOException
获取 Parcelable 遇到 IOException 写入可序列化对象
Parcelable 遇到 IOException 写入可序列化对象 getactivity()
Parcelable 在写入可序列化对象时遇到 IOException ......?
Parcelable 在将对象的实例发送到其他活动时遇到 IOException
java.lang.RuntimeException: Parcelable 遇到 IOException 写入可序列化