0

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

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);

从捆绑包中恢复时,我有这个:

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

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

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

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

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

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

然后一切都按预期工作。

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

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

有什么想法我做错了什么,还是有更好的方法来实现我想要实现的目标?

4

1 回答 1

0

在 Android 中执行此操作的推荐方法是使您想要持久化的对象成为 Parcelable。这是一种特定于 Android 的序列化类型。在这里查看官方文档

于 2015-03-13T14:57:14.943 回答