Внутреннее сохранение данных в Android портит мои данные
В настоящее время я работаю над игрой, где мне нужно создать таблицу транспонирования для моего ИИ. Я реализовал Hashtable
таким образом key
Hashtable - это рассматриваемое состояние и его 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 для двух состояний, которые должны были быть добавлены в таблицу. Однако, читая таблицу из файла, hashCode()
вернулся 9119 дважды.
Есть ли проблема в сохранении / восстановлении данных?
1 ответ
Мои сериализации и хэширования были полностью в порядке. Моя программа пошла примерно так:
- добавить новую пару ключ-значение в
transpositionTable
- играть следующим ходом
- спасти
transpositionTable
на внутреннюю память
Однако после тщательной регистрации я обнаружил, что мой transpositionTable
изменилось после шага 2). Это было потому, что во время шага 1) я использовал
BoardState newKey = currentData.getBoardState();
и сохранил его в мой transpositionTable
, Затем в шаге 2), когда мой currentData
изменилось, мой transpositionTable
изменилось соответственно. Я пытался с помощью
BoardState newKey = currentData.getBoardState().clone();
но это тоже не сработало. Наконец я должен был назначить каждое поле currentData.getBoardState()
в newKey
вручную, который работал.