首页 > 解决方案 > 尝试保存和加载基于文本的 ui 游戏时如何修复 java.io.NotSerializableException?

问题描述

我对 java 还很陌生,我正在尝试在基于文本的 UI 游戏保存和加载中实现两种方法,但是当我在终端中运行 save 命令时遇到了一些困难,我得到了 java.io.NotSerializableException我也收到相同的加载错误。本质上我只是想保存游戏状态并加载游戏状态,但我不确定我哪里出错了或者我做得是否正确,非常感谢你的帮助。

  public TikTakToeUI() {
    scnr   = new Scanner(System.in);
    game   = new TikTakToe();
    player = new Player();
  }

  private void execute(String command) 
  {
    File inFile = new File ("input.txt");
    
    if (command.equalsIgnoreCase("Save")) {
      save(inFile);
    }else if (command.equalsIgnoreCase("Load")){
        load(inFile);
    }else {
      System.out.println("Unknown command (" + command + ")");
      displayMenu();
    }
  }

  private void save(File file)
  {
    try {   
        FileOutputStream fileStream = new FileOutputStream(file);   
        ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);   

        objectStream.writeObject(game);   
        objectStream.writeObject(scnr);   
        objectStream.writeObject(player);   
       
        objectStream.close();   
        fileStream.close();   

        JOptionPane.showConfirmDialog(null, 
            "Save game state successfully.", 
            "Tik Tak Toe Game",   
            JOptionPane.DEFAULT_OPTION);   
    } catch (Exception e) {   
        JOptionPane.showConfirmDialog(null, 
            e.toString() + "\nFail to save game state.",   
            "Tik Tak Toe Game", 
            JOptionPane.DEFAULT_OPTION);   
    }   
  }

  private void load(File file)
  {
    try 
    { 
      FileInputStream fileStream = new FileInputStream(file);   
      ObjectInputStream objectStream = new ObjectInputStream(fileStream); 
    
  
      scnr = (Scanner) objectStream.readObject();
      game = (TikTakToe) objectStream.readObject();   
      player = (Player) objectStream.readObject();
    }
    catch (Exception e) {   
        JOptionPane.showConfirmDialog(null, 
            e.toString() + "\nFail to load game state.",   
            "Tik Tak Toe Game", 
            JOptionPane.DEFAULT_OPTION);   
    }  
  }

标签: java

解决方案


您只能在开始游戏时保存并TikTakToe创建一个新的。PlayerScanner

你应该更新TikTakToePlayer类并实现Serializable接口

public class TikTakToe implements Serializable {}
public class Player implements Serializable {}

推荐阅读