用Java序列化游戏?

Posted

技术标签:

【中文标题】用Java序列化游戏?【英文标题】:Serializing a game in Java? 【发布时间】:2013-01-18 22:58:31 【问题描述】:

我正在尝试用 Java 序列化一个蛇游戏,其中游戏必须具有“save”和“load”选项。我没有收到任何错误,但每当我尝试打印出 lifestime 等时,它只会给我 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() 是否将vecBodylife 设置为值!=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序列化游戏?的主要内容,如果未能解决你的问题,请参考以下文章

Java:序列化和反序列化音频文件

华为OD机试题,用 Java 解密室逃生游戏问题

无法从 START_OBJECT 令牌中反序列化 `java.lang.Long` 的实例;在 Spring Boot 帖子上

Java基础序列化与反序列化深入分析

JAVA 压缩和序列化

Java序列化与反序列化