我试图在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();
}
答案 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的默认值进行修改,也许这就是在反序列化后读取零的原因。