今天遇到一个问题:
用intent传递一个arraylist<object>,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.非静态内部类序列化会出问题,请谨慎使用!!!