【问题标题】:android: problem with Serializable object put into intentandroid:将Serializable对象放入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的序列化有效..?

标签: android arraylist android-intent serializable


【解决方案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。之后,您可以将您的数组列表放入意图中,并将它们放入另一个活动中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      相关资源
      最近更新 更多