【问题标题】:Saving data internally in Android messes up my data在 Android 内部保存数据会弄乱我的数据
【发布时间】:2012-07-31 12:43:35
【问题描述】:

我目前正在开发一款游戏,我需要为我的 AI 创建一个转置表。我实现了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() 为要添加到表中的 2 个状态返回 3964 和 3029。但是,在从文件中读取表格时,hashCode() 两次返回 9119。

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

【问题讨论】:

  • 也许 BoardState 没有正确序列化?写入和读取到文件后,您是否验证其成员正确?
  • 您自己实现了 Hashtable?你为什么不使用HashMap?我从来没有遇到过序列化问题。请添加一些序列化过程的代码。
  • @ekholm 我刚刚将 implements Serializable 添加到 BoardState。除此之外,我的 Board 状态只包含几个实例变量、getter、setter、hashCode() 和 equals()。 @Martze 不,我使用了 Java 库 (java.util.Hashtable) 中的 Hashtable。 HashMap我没试过。
  • 那是正确的序列化方式吗?
  • 为了调试,我会尝试将几个BoardState对象一个一个写入ObjectOutputStream,用ObjectInputStream读回每个对象,并验证所有字段是否正确

标签: android storage hashtable internal gomoku


【解决方案1】:

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

  1. 将新的键值对添加到transpositionTable
  2. 下一个动作
  3. 保存transpositionTable到内部存储

但是,经过细致的记录后,我发现我的transpositionTable 在第 2 步之后发生了变化)。这是因为在步骤 1) 中,我使用了

BoardState newKey = currentData.getBoardState();

并将其保存到我的transpositionTable。然后在步骤 2) 中,当我的 currentData 更改时,我的 transpositionTable 也相应更改。我尝试使用

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多