モデル、ビュー、コントローラーの 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();
}
}
私は以前、まったく同じスキームを使用する別のプログラムでこの方法を行ったことがあり、完全に機能しました。したがって、「ボード」のみをシリアル化するときに、他のすべてをシリアル化しようとしている理由が本当にわかりません。
コードの他の部分が必要な場合は、お問い合わせください。
前もって感謝します!