【问题标题】:Restoring an ArrayList of custom objects恢复自定义对象的 ArrayList
【发布时间】:2015-03-13 14:37:56
【问题描述】:

在我的应用程序(这是一个游戏)中,我有一个“敌人”类,例如:

public class Enemy extends Sprite implements Serializable {

    public Enemy(EnemyType type){
        super();
    }

}

然后我像这样声明了一个 ArrayList:

ArrayList<Enemy> enemyList = new ArrayList<Enemy>();

我可以添加敌人:

enemyList.add(bird);
enemyList.add(bee);

当保存到捆绑包时,我简单地说:

bundle.putSerializable("Enemies", enemyList);

当从 Bundle 中恢复时,我有这个:

enemyList = (ArrayList<Enemy>) savedState.getSerializable("Enemies");

现在,它似乎恢复了数组列表(我可以检查它的大小并且它总是正确的 - 即,从包恢复时的大小与保存到包时的大小相同。

例如,我还记录了 ArrayList 的第一个索引,果然它列出了存在的敌人实例。

但是,如果我尝试在恢复后的任何时间操作 ArrayList,我会收到一个异常,告诉我我正在尝试对 Null 对象(enemyList)执行 [whatever action]。

如果我只是自己填充列表,那么有类似的内容:

enemyList = (ArrayList<Enemy>) savedState.getSerializable("Enemies");
enemyList.add(bird);
enemyList.add(bee);

然后一切都按预期进行。

我假设这与 Enemy 的超类没有序列化这一事实有关?但是,如果我对此进行序列化,则会收到“notSerializableException”错误。

请注意,我并不太担心将实际的 Enemy 对象保存/恢复到 Bundle,我可以手动处理。相反,我只希望列表处于与以前相同的状态。而且我认为存储在 ArrayList 中的只是对相关对象的引用,因此我无法弄清楚为什么会发生这种情况?

任何想法我做错了什么或有更好的方法来实现我想要实现的目标?

【问题讨论】:

  • 我只是希望列表处于与以前相同的状态,您的意思是您获得了正确的值但 UI 未更新?
  • 为什么要将列表保存到Bundle
  • @Xcihnegn,因为我需要它处于与以前相同的状态。这是为了在系统终止应用程序时保留游戏状态(例如,用户在游戏期间接到电话,在操作系统终止应用程序后一小时后返回 - 我需要保留所有内容以便它可以接听它停止的地方 - 保存实际对象的当前状态不是问题,但我不知道如何保持列表完好无损)。
  • @LochanaRagupathy - 我真的不确定,我想这就是可能发生的事情。我所知道的是,在它恢复后,我可以立即访问它,但是一旦我切换回游戏正常,它就会看到它为空.....
  • 配置更改时保存数据,有更好的方法是将数据保存到另一个保留状态的片段

标签: android serialization arraylist bundle custom-object


【解决方案1】:

在 Android 中执行此操作的推荐方法是将要持久化的对象设置为 Parcelable。这是一种特定于 Android 的序列化类型。 看看官方文档here

【讨论】:

  • 感谢@RaresBarbantan,但问题不在于如何保存对象的状态,我已经可以这样做(实际上,我过去使用过 Parcelable,但目前只保存我想要的属性而不是使整个对象 Parcelable)。我目前面临的问题是如何向/从 Bundle 发送和检索 ArrayList(充满自定义对象)。我只需要 ArrayList 处于相同的状态并能够访问其中的对象(无论如何,当重新启动应用程序时,这些对象都会重新创建,所以我不需要保存它们)。
  • 这正是 Parcelable 的目的所在。甚至 Bundle 类也被定义为“从 String 值到各种 Parcelable 类型的映射”
  • 您是说这不能使用“可序列化”来实现吗? (我读过一些推荐使用这个的帖子)。我目前没有使用 Parcelable,如果可能的话,我宁愿保持这种状态。
  • 应该是可以的,只是慢了大约 10 倍。但是为了使序列化工作,所有字段也需要是可序列化的。这意味着 Sprite 类也需要如此,我对此表示怀疑,假设它具有对位图的某种引用(例如,它是不可序列化的)。不幸的是,这也适用于包裹
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 2015-07-10
  • 2015-06-17
  • 2010-10-19
  • 2013-03-02
  • 1970-01-01
  • 2015-12-22
  • 2015-11-26
相关资源
最近更新 更多