android:将Serializable对象放入intent的问题
Posted
技术标签:
【中文标题】android:将Serializable对象放入intent的问题【英文标题】:android: problem with Serializable object put into intent 【发布时间】:2010-12-05 15:08:22 【问题描述】:您好,我想通过将其放入 putExtras() 来传递意图的类有问题 它是可序列化的,代码如下:
public abstract class ObjectA extends ArrayList<ObjectA> implements java.io.Serializable...
public class ObjectB extends ObjectA ...
...
Bundle extras = new Bundle();
extras.putSerializable("blabla", ObjectB);
intent.putExtras(extras);
...
Object y = getIntent().getExtras().get("blabla");
问题是,y 现在是一个 ArrayList 而不再是 ObjectB,所以我不能转换它.. 如果我将代码更改为
public class ObjectB implements java.io.Serializable ...
效果很好
【问题讨论】:
只是出于好奇,在这种情况下,什么是“意图”? 好的,我刚刚添加了android标签(再次),intent是android内部的东西 啊。谢谢! 15个字!哇! ArrayLists 没有实现 Serializable,你可以使用向量或者为 Serializable 编写自己的保存和加载函数。 当我用另一个只实现串行的对象包围扩展 arraylist 的对象时。比没有问题,所以我认为arraylist的序列化有效..? 【参考方案1】:通过在你的类中实现 java.util.List 和 java.io.Serializable,你触发了这个android bug。
【讨论】:
我想我偶然发现了同样的问题:如果我通过 putSerializable 将 LinkedList 填充到一个包中,当我尝试通过 getSerializable 获取它时,我会收到一个 ArrayList。不是吗? 是的,它似乎确实在多种情况下弄乱了 Serializables 中的 LinkedLists。 2009 年的错误,3 年后仍然存在 :( 仍然在这里,现在是 2014 年 :(【参考方案2】:我怀疑正在发生的事情是,由于您没有将 ObjectB 声明为可序列化,因此它正在“回退”到最近的父对象。因此,当您将其放入 Bundle 时,您实际上并没有放入 ObjectB,而是将 ObjectB 转换回 ArrayList。
我认为您将不得不使用第二个(“工作正常”)代码。
【讨论】:
我现在用一个包含 ObjectB 实例的类(实现可序列化)围绕 ObjectB。我需要 objectB 成为 objectA 的孩子,所以我认为这是最好的解决方案。它只是在代码上做了一点改动 为什么不能让 ObjectB 扩展 ObjectA 并实现 Serializable?【参考方案3】:在将 ObjectB 传递到包之前如何声明它? 根据我对您的问题的了解,您在传递捆绑包时不会出错,只有在删除它时才会出错。 尝试将您的 ObjectB 直接检索为 ObjectB 类型,如下所示:
ObjectB y = (ObjectB) getIntent().getExtras().get("blabla");
【讨论】:
【参考方案4】:ArrayList
中的ObjectA
应该实现接口Parcelable
。之后,您可以将您的数组列表放入意图中,并将它们放入另一个活动中。
【讨论】:
以上是关于android:将Serializable对象放入intent的问题的主要内容,如果未能解决你的问题,请参考以下文章
Android系统中Parcelable和Serializable的区别
java android 序列号serializable和parcelable
从 Android 中的对象实现 Serializable 和 Parcelable 接口 - 冲突
Android :安卓学习笔记之 通过Intent传递类对象(实现Serializable和Parcelable接口)