【问题标题】:Save game to file将游戏保存到文件
【发布时间】:2012-11-27 21:11:02
【问题描述】:

我正在开发一个原始 RPG,这个类(据说)包含所有必要的数据:

public class CPU implements Serializable{

private Map<String, Location> locations;
private Map<String, Location> places;
private Map<String, NPC> npcs;
private Game game;
private Player player;
private NPC currentNPC;

public CPU(){

}

(我没有包括方法,但我认为这些现在无关紧要......)

“Game”类还包含作为变量的 Player 和 CPU,但它的构造函数并不是实际创建它们的构造函数(它们是在 main() 方法中创建的,然后添加到类中)。这个方法应该是把 CPU 类保存到一个文件中,以便我以后可以从中读取所有数据:

public void SaveGame(String s){
    String sav = s;
    sav.concat(".dat");
    try {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(sav));
        oos.writeObject(cpu);
        oos.close();
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

这是从文件中加载它的方法:

public void Load(String s){
    if(s.contains(".dat")){
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(s));
            cpu = (CPU)ois.readObject();
            ois.close();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

我的问题基本上是:这行得通吗?我是否能够简单地序列化 CPU 类并将其保存到文件中,然后将其读回并能够从中恢复所有数据(即播放器数据)?

如果我没记错的话,在Java中“=”并不意味着右边的对象会被复制,所以我的另一个问题是:当“Load”方法完成时,“cpu”(变量“游戏”类)仍然包含我从文件中加载的 CPU,我可以从中读取数据吗?

【问题讨论】:

  • 如果其他类是可序列化的,它应该可以工作 e.i.游戏,玩家和NPC,但你为什么不试试呢?
  • 你尝试的时候发生了什么?
  • 关于你的最后一段:为什么加载的 CPU 实例会神奇地消失?在 Java 中,您基本上是在分配引用,只要您有某个对象的引用,它就不会被垃圾回收。
  • 还没有尝试过,因为我已经工作了将近 10 个小时,并且我正在做一些别的事情...... ;)

标签: java file serialization


【解决方案1】:

实际上,只有当您传递给SaveGame() 方法的原始文件名包含".dat" 时,它才会起作用。

确实,读取方法会检查该条件,并且 SaveGame() 方法(应命名为 saveGame() 以尊重 Java 命名约定)不会像您想象的那样将 .dat 附加到文件名。事实上,字符串是不可变的,concat() 方法返回一个新的字符串,但不会修改调用它的字符串。代码应该是

String sav = s.concat(".dat");

您还应该停止像您正在做的那样忽略异常,并且应该始终在 finally 块中关闭流。如果您使用的是 Java 7,请使用 try-with-resources 构造。

【讨论】:

  • 该死的......字符串类又搞砸了我......感谢您的输入!
  • 顺便说一句,我并没有忽略例外情况。我只是没有在这里包含“catch”块的其余部分。但是当我们讨论这个主题时:如果包含文件名的字符串不正确,加载方法会抛出“FileNotFoundException”吗?我想用它来处理任何此类错误。
  • 是的,根据the documentation
【解决方案2】:

如果您的程序具有写入文件的权限,并且所有字段类(NPC、游戏、玩家。位置)也是可序列化的,那么它会工作

Game类的cpu字段包含从文件中加载的CPU,如果读取对象时不抛出异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    相关资源
    最近更新 更多