安卓:将Serializable对象放入intent中出现问题

5

你好,我有一个关于类的问题,我想通过将其放入putExtras()中来传递它的Intent。这个类是可序列化的,代码如下:

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 {...}

它工作得很好。


只是出于好奇,这里的“意图”是什么意思? - Jonathan Feinberg
好的,我刚刚又添加了Android标签,Intent是Android内部的东西。 - Simon
啊,谢谢!15个字符!耶! - Jonathan Feinberg
ArrayLists不实现Serializable接口,您可以使用Vector或编写自己的保存和加载函数来实现Serializable。 - user195846
当我将扩展ArrayList的对象与另一个仅实现serial的对象一起包围时,就没有问题了,因此我认为ArrayList的序列化工作正常...? - Simon
4个回答

14
通过在你的类中实现java.util.List和java.io.Serializable,你触发了这个android bug。请参考此链接

我认为我遇到了同样的问题:如果我通过putSerializable将LinkedList放入Bundle中,当我尝试通过getSerializable获取它时,我会收到一个ArrayList。是这样吗? - superjos
是的,在多种情况下,它似乎会在序列化中搞砸LinkedLists。 - jjb
2009年的Bug,三年后仍然存在 :( - mbritto
还在这里,现在已经是2014年了 :( - darkflame

0
你在将ObjectB传入Bundle之前如何声明它? 根据我对你问题的理解,当你传入bundle时没有错误,只有在移除它时才出现错误。 尝试像这样直接将ObjectB恢复为ObjectB类型:
ObjectB y = (ObjectB) getIntent().getExtras().get("blabla");

0

ArrayList 中的 ObjectA 应该实现接口 Parcelable。之后,您可以将您的 arraylists 放入 intent 中,在另一个 activity 中获取它们。


0

我怀疑发生的情况是,由于您没有将ObjectB声明为可序列化,它会“回退”到最近的父对象。因此,当您将其放入Bundle时,实际上并没有放入ObjectB,而是将ObjectB强制转换为ArrayList。

我认为您需要选择第二个(“正常工作”)代码。


我现在用一个类(实现了Serializable接口)将ObjectB包围起来,这个类中包含了ObjectB的实例。我需要ObjectB成为ObjectA的子类,所以我认为这是最好的解决方案。这只是代码上的一个小改动。 - Simon
为什么你不能让ObjectB继承ObjectA并实现Serializable呢? - Jeremy Logan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接