用Java序列化游戏?
Posted
技术标签:
【中文标题】用Java序列化游戏?【英文标题】:Serializing a game in Java? 【发布时间】:2013-01-18 22:58:31 【问题描述】:我正在尝试用 Java 序列化一个蛇游戏,其中游戏必须具有“save”和“load”选项。我没有收到任何错误,但每当我尝试打印出 lifes、time 等时,它只会给我 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();
【问题讨论】:
您正在保存PnlCentro pnlCentro = new PnlCentro();
- 一个 新 实例 - 您确定 默认 值(数字为 0)正在更改吗?跨度>
new PnlCentro()
是否将vecBody
、life
设置为值!=0?
我认为当我添加一个新实例时,它会将所有值更改为原始值,但我不知道如何将其与新实例一起保存。
【参考方案1】:
我认为您的 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();
注意SaveGame()
方法中pnlCentro
的初始化行。该对象是使用默认构造函数声明和实例化的。除非您已覆盖默认构造函数以使用当前游戏数据实例化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();
【讨论】:
@BryamUlloa 我的回答有帮助吗? 实际上它确实有所帮助,问题是我需要创建一个新的类实例,因为我在一个单独的类中为保存和加载方法工作,但是每当我创建一个实例时我所有的变量都重置了。所以我只是将类中的保存和加载方法进行了序列化。 @BryamUlloa 所以听起来我的回答是可以接受的吗? cough-cough-hint-hint【参考方案2】:在SaveGame方法中,你总是在序列化之前创建一个新的PnlCentro实例,当你使用代码时:
PnlCentro pnlCentro = new PnlCentro();
在序列化之前没有对对象 plnCentro 的默认值进行修改,这可能是您在反序列化后读取零的原因。
【讨论】:
以上是关于用Java序列化游戏?的主要内容,如果未能解决你的问题,请参考以下文章
无法从 START_OBJECT 令牌中反序列化 `java.lang.Long` 的实例;在 Spring Boot 帖子上