Android笔记-5:intent传递arraylist出现java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 的问题

今天遇到一个问题:

用intent传递一个arraylist,object里面有一个接口对象,当然也继承了Serializable接口。当我把初始化arraylist方法写成静态方法就可以传递,写成成员方法,就无法传递,始终报错。无法序列化。异常如下:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object

我把接口对象改成实体对象后就没有异常了。

百度许久也不知为何。

个人感觉是静态方法把对象以及其内的接口对象也序列化了,动态方法却只能序列化该对象和其内的实体对象,其内接口对象并没有序列化。导致异常。(有读者知道具体原因可以留言告诉我。)

最后只能用静态方法来实现,用广播机制通知后续处理方法。

后续,补充:

此问题一直在我脑子里,所以我又在网上搜索关于接口是否可以序列化的问题。终于发现此贴参考此贴,见2楼分析。原来是因为实现接口我用的是内部类的方式。非静态内部类会隐含保存一个指向其外部类实例的引用。序列化估计会有问题。

后面我将会新建一个非内部类来测试此问题。待续。。。

后续2:找到原因之后,我果断把接口的实现改为了外部类,经测试果然没有异常了。

总结:

1.其实标题的arraylist与本文的核心无关,笔者被网上的一些帖子误导了。文章标题应该改为《intent传递非静态内部类出现java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 的问题》

2.接口对象也不是重点,重点是非静态内部类

3.其实我用静态方法初始化时候,内部类是静态的,从而被序列化了。

4.非静态内部类序列化会出问题,请谨慎使用!!!

你可能感兴趣的:(Android笔记-5:intent传递arraylist出现java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 的问题)