用Java序列化游戏?

时间:2013-01-18 22:58:32

标签: java serialization load save game-engine

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

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

  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();

}

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

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

PnlCentro pnlCentro = new PnlCentro();

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