1

我试图用Java序列化一个蛇游戏,其中游戏必须有“保存”和“加载”的选项。我没有收到任何错误,但每当我尝试打印出生命时间等时。当生命和时间不应该为0时,它只会给我0

这是我保存和加载部分的一些代码:

  public void SaveGame() throws IOException {

    PnlCentro pnlCentro = new PnlCentro();

    FileOutputStream fileOut = new FileOutputStream(fileName);
    ObjectOutputStream out = new ObjectOutputStream(fileOut);
    out.writeObject(pnlCentro);
    out.close();
}

public void LoadGame() throws FileNotFoundException, IOException, ClassNotFoundException {

    PnlCentro p = null;

    FileInputStream fileIn = new FileInputStream(fileName);
    ObjectInputStream in = new ObjectInputStream(fileIn);

    p = (PnlCentro) in.readObject();

    System.out.println("Body: " + p.vecBody);
    System.out.println("Life: " + p.life);
    System.out.println("Timer: " + p.getTime());

    in.close();
    fileIn.close();

}
4

2 回答 2

3

我认为您的SaveGame()LoadGame方法工作得很好,它们只是不保存或加载当前游戏会话中的任何数据。

  public void SaveGame() throws IOException {

    PnlCentro pnlCentro = new PnlCentro(); //<-- Problem likely lies here!

    FileOutputStream fileOut = new FileOutputStream(fileName);
    ObjectOutputStream out = new ObjectOutputStream(fileOut);
    out.writeObject(pnlCentro);
    out.close();
}

注意方法pnlCentro中的初始化行SaveGame()。该对象是使用默认构造函数声明和实例化的。除非您已覆盖默认构造函数以pnlCentro使用当前游戏数据实例化对象,否则当前游戏数据在写入磁盘之前永远不会设置。

考虑一下:

  public void SaveGame() throws IOException {

    PnlCentro pnlCentro = new PnlCentro();

    /* Set data prior to writing out */
    pnlCentro.setLives(getThisGamesNumLives());
    pnlCentro.setTime(getThisGamesTime());

    FileOutputStream fileOut = new FileOutputStream(fileName);
    ObjectOutputStream out = new ObjectOutputStream(fileOut);
    out.writeObject(pnlCentro);
    out.close();
}
于 2013-01-19T00:21:20.357 回答
2

在 SaveGame 方法中,您总是在序列化之前创建一个新的 PnlCentro 实例,当您使用代码时:

PnlCentro pnlCentro = new PnlCentro();

在序列化之前没有对对象 plnCentro 的默认值进行任何修改,这可能就是您在反序列化后读取零的原因。

于 2013-01-19T00:21:05.200 回答