Saving data internally in Android messes up my data

六月ゝ 毕业季﹏ 提交于 2019-12-11 08:14:51

问题


I'm currently working on a game, where I need to create a transposition table for my AI. I implemented Hashtable so that the key to the Hashtable is a state under consideration and its corresponding value is the optimal next move.

However, when I save the Hashtable in Android's internal storage and restore it next time, it seems to have some saved data, but the keys (i.e. game states) are different than the keys I have saved in the previous instance.

Here is how I save and restore my data:

    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();
    }

I see no problem in my hashCode() implementation, since it keeps returning same values for same states over and over.

I suspect saving/restoring the transposition table messes up my data because I logged the 2 runtimes and on the first one I got hashCode() to return 3964 and 3029 for the 2 states that were to be added to the table. However, while reading the table from file, the hashCode() returned 9119 twice.

Is there any problem in saving/restoring the data?


回答1:


My serializing and hashing was completely fine. My program went something like this:

  1. add new key-value pair to transpositionTable
  2. play next move
  3. save transpositionTable to internal storage

However, after meticulous logging, I found that my transpositionTable changed after step 2). This was because during step 1), I used

BoardState newKey = currentData.getBoardState();

and saved it to my transpositionTable. Then in step 2), when my currentData changed, my transpositionTable changed accordingly. I tried using

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

but that didn't work either. Finally I had to assign each field of currentData.getBoardState() to newKey manually, which worked.



来源:https://stackoverflow.com/questions/11740339/saving-data-internally-in-android-messes-up-my-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!