【发布时间】: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