1

何かを計算してその情報をhashTableに格納するプログラムを作成しています。私がやりたいのは、次に実行して、hashTableに格納されている以前の値を復元して再開することです。だから私はオブジェクトをファイルに保存する方法を尋ねますか?

私のコードでは、FileInputStreamとFileOutputStreamを使用しています。これまでのところ、私のコードの一部を次に示します。

@SuppressWarnings("unchecked")
private void obtainSaveFile(){
    String file = new String("./saveFile.txt");
    try{
        //Create the file if it doesn't exist
        if( !( (new File(file)).exists() ) ){

            //Create new empty file
            (new File(file)).createNewFile();

            //Creates a fresh new hashTable
            hashTable = new QuadraticProbingHashTable<TicTacToeBoard>();
        }
        else{
            //Obtain the hashTables saved config.txt file
            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis);

            //Obtain the previously saved hashTable
            //-----------------------------------
            //This line of code gives me an error
            //-----------------------------------
            hashTable = (QuadraticProbingHashTable<TicTacToeBoard>)ois.readObject();
            ois.close();
        }

        //Create save file configs.txt
        FileOutputStream fos = new FileOutputStream(file);
        saveFile = new ObjectOutputStream(fos);     

    }catch(Exception e){
        e.printStackTrace();

        //Creates a fresh new hashTable
        //This line of code gives me an error
        hashTable = new QuadraticProbingHashTable<TicTacToeBoard>();
    }
}

最初は、ファイルがない場合は正常に実行されます。しかしその後、それは私にエラーを与え続けます。ファイルからオブジェクトを取得してQuadraticProbingHashTableとしてキャストし、それをhashTableと等しく設定するのは好きではありません。

また、エラーとして出力されるものは次のとおりです。

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: proj4.QuadraticProbingHashTable$HashEntry
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readArray(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at proj4.TicTacToeSolver.obtainSaveFile(TicTacToeSolver.java:308)
    at proj4.TicTacToeSolver.solve(TicTacToeSolver.java:120)
    at proj4.Main.main(Main.java:41)
Caused by: java.io.NotSerializableException: proj4.QuadraticProbingHashTable$HashEntry
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeArray(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at proj4.TicTacToeSolver.solve(TicTacToeSolver.java:246)
    ... 1 more
Exception in thread "main" java.lang.NullPointerException
    at proj4.TicTacToeSolver.solve(TicTacToeSolver.java:246)
    at proj4.Main.main(Main.java:41)
4

2 に答える 2

3

さて、問題は、Serializable を実装していないものをシリアル化しようとしているようです。ここでそれを見ることができます:

java.io.NotSerializableException: proj4.QuadraticProbingHashTable$HashEntry

次の 2 つの選択肢があります。

  1. 可能であれば、HashEntry に Serializable を実装させます
  2. シリアル化されないように一時的なものとしてマークします(おそらく、あなたが望むものではありません)。

詳細については、クラスを投稿できます。

于 2012-05-02T16:30:43.680 に答える
2

問題は、テーブルがシリアル化可能であっても、シリアル化できないハッシュテーブルにキーまたは値を追加したことです。すべてのオブジェクトをハッシュテーブルに入れることができますが、すべてのオブジェクトをシリアル化できるわけではありません。ハッシュテーブルにどのようなオブジェクトを入れていますか?

于 2012-05-02T16:33:18.550 に答える