【问题标题】:How to fix a java.io.NotSerializableException when trying to save and load a text based ui game?尝试保存和加载基于文本的 ui 游戏时如何修复 java.io.NotSerializableException?
【发布时间】:2021-02-20 14:18:12
【问题描述】:

我对 java 还很陌生,我正在尝试在基于文本的 UI 游戏保存和加载中实现两种方法,但是当我在终端中运行 save 命令时遇到了一些困难,我得到了一个 java.util. 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


【解决方案1】:

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

更新TikTakToePlayer 类并实现Serializable 接口应该做什么

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

【讨论】:

  • 我刚刚添加了这些更改,似乎得到了这个 java.io.NotSerializableException: Cell failed to save game state
  • WriteObject 和 ReadObject 时你删除了Scanner 吗?
  • 是的,我从保存和加载两种方法中删除了它。
  • 嗯,奇怪的行为!
  • 谢谢,现在可以将implements Serializable 添加到 Cell 类中,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 2011-12-02
  • 1970-01-01
相关资源
最近更新 更多