在Android内部保存数据会弄乱我的数据

时间:2012-07-31 12:43:35

标签: android storage hashtable internal gomoku

我正在开发一款游戏,我需要为我的AI创建换位表。我实施了Hashtable,以便Hashtable的key是一个正在考虑的状态,其相应的value是最佳的下一步行动。

但是,当我将Hashtable保存在Android的内部存储中并在下次恢复时,它似乎有一些已保存的数据,但keys(即游戏状态)与keys我不同已保存在上一个实例中。

以下是我保存和恢复数据的方法:

    private void readTranspositionTableFromFile() {
        FileInputStream fis = openFileInput(FILENAME);
        ObjectInputStream ois = new ObjectInputStream(fis);
        transpositionTable = (Hashtable<BoardState, NextMove>) ois.readObject();
        ois.close();
        deleteFile(FILENAME);
    }

    private void writeTranspositionTableToFile() {
        FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(transpositionTable);
        oos.close();
    }

我在hashCode()实现中看到没有问题,因为它一遍又一遍地为相同的状态返回相同的值。

我怀疑保存/恢复转置表会弄乱我的数据,因为我记录了2个运行时,并且在第一个运行时我得到hashCode()以返回3964和3029表示要添加到表中的2个状态。但是,从文件中读取表时,hashCode()两次返回9119。

保存/恢复数据有什么问题吗?

1 个答案:

答案 0 :(得分:0)

我的序列化和散列完全没问题。我的程序是这样的:

  1. 将新的键值对添加到transpositionTable
  2. 播放下一步行动
  3. transpositionTable保存到内部存储空间
  4. 然而,经过细致的记录后,我发现我的transpositionTable在步骤2之后发生了变化。这是因为在步骤1)中,我使用了

    BoardState newKey = currentData.getBoardState();

    并将其保存到我的transpositionTable。然后在步骤2)中,当我的currentData发生变化时,我的transpositionTable也相应地发生了变化。我尝试使用

    BoardState newKey = currentData.getBoardState().clone();

    但这也不起作用。最后,我必须手动将currentData.getBoardState()的每个字段分配给newKey,这有效。