恢复自定义对象的ArrayList

时间:2015-03-13 14:37:56

标签: android serialization arraylist bundle custom-object

在我的应用程序(这是一款游戏)中,我有一个' Enemy' class,例如像:

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时,我只需输入:

bundle.putSerializable("Enemies", enemyList);

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

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

现在,它确实似乎恢复了arraylist(我可以检查它的大小,它总是正确的 - 即,从捆绑中恢复的大小相同,就像保存到捆绑包时一样。

我还记录了例如ArrayList的第一个索引,并且确定它将敌人实例列为存在。

但是,如果我在恢复后的任何时候尝试操作ArrayList,我会得到一个异常,告诉我我正在尝试对Null对象(enemyList)执行[无论什么操作]。

如果我只是自己填充列表,那么就像:

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

然后一切都按预期工作。

我认为这与敌人的超级级别没有被序列化的事实有关?但是,如果我将其序列化,我会得到一个“不可信的异常”#39;错误。

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

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

1 个答案:

答案 0 :(得分:0)

在Android中执行此操作的推荐方法是使要保留的对象成为Parcelable。这是一种特定于Android的序列化。 查看官方文档here