0

モデル、ビュー、コントローラーの 3 つのパッケージが src 内にあります。ビューにはいくつかの JFrames があり、モデルにはプログラムのロジックを処理するいくつかのクラスがあり、コントローラーにはビューからの JFrames のインスタンスを含む 1 つのクラスと、「ボード」と呼ばれるモデルからのオブジェクトが 1 つだけあります。モデルには、ロードするための静的メソッドと、このオブジェクト「ボード」を保存するための静的メソッドのみを持つ Saver というクラスがあることに言及する必要があります。

オブジェクト「ボード」をシリアライズしようとすると (ボードとモデル内のすべてのクラスがシリアライズ可能)、ビュー内のすべてのクラスとコントローラー クラス内のすべての内部クラスからスタック トレース NotSerializableException が取得されます。モデルに属する「ボード」のみをシリアル化しようとしています。ボードの変数はすべてシリアル化可能です。

Saver クラスから保存およびロードするメソッドは次のとおりです。

public class Saver {

public static void saveBoard(Board board) throws IOException{
    FileOutputStream fileOutputStream = new FileOutputStream("gosavefile.gsf");
    ObjectOutputStream obout = new ObjectOutputStream(fileOutputStream);

    obout.writeObject(board);

    fileOutputStream.close();
    obout.close();
}

public static Board loadBoard() throws IOException, ClassNotFoundException{
    FileInputStream fileInputStream = new FileInputStream("gosavefile.gsf");
    ObjectInputStream obin = new ObjectInputStream(fileInputStream);

    Board board = (Board) obin.readObject();

    fileInputStream.close();
    obin.close();

    return board;
}

}

ここで、コントローラ クラスから saveBoard() メソッドを呼び出します。

public void save(){
    try{
        Saver.saveBoard(board);
    } catch (IOException e) {
        new SaveErrorWindow(mainMenuWindow.getLanguageManager());
        e.printStackTrace();
    }
}

私は以前、まったく同じスキームを使用する別のプログラムでこの方法を行ったことがあり、完全に機能しました。したがって、「ボード」のみをシリアル化するときに、他のすべてをシリアル化しようとしている理由が本当にわかりません。

コードの他の部分が必要な場合は、お問い合わせください。

前もって感謝します!

4

2 に答える 2

0

クラスが を実装するだけでは十分ではありませんjava.io.Serializable。また、すべてのフィールドがシリアライズ可能であることも保証する必要があります (プリミティブまたは を実装するクラスのいずれかSerializable) などです。クラスに として宣言されていないシリアル化不可のフィールドがある場合transient、シリアル化は失敗します。スタック トレースは、どのクラスが問題を引き起こしたかを示しているはずです。

于 2014-02-15T00:43:35.953 に答える
0

シリアル化するために、オブジェクトは次のことを行う必要があります。

  • 埋め込むSerializable
  • すべての非一時的および非静的フィールドは、プリミティブまたはシリアライズ可能である必要があります。配列はシリアライズ可能と見なされますが、その要素はシリアライズ可能でなければなりません
于 2014-02-15T00:35:26.927 に答える