1

我正在用 Java 实现一个基本的棋盘游戏,我很难决定解决的利弊。我已经成功地利用命令模式在游戏中启用撤消功能,并且最初打算通过序列化整个游戏模型对象集来实现游戏保存/加载。

但是我意识到,由于游戏是一个棋盘游戏,不涉及随机元素并且总是以相同的状态初始化,我可以通过简单地序列化包含命令堆栈和命令本身的对象来实现保存/加载功能,并且然后重新执行所有命令以将游戏带到保存的位置。

我当前的设计不允许我这样做,因为我的命令包含对构成我的板的图块和块的对象实例的引用,我认为这是最佳 OO 实践。这意味着我还必须序列化这些模型对象,这将破坏仅序列化命令并执行它们的目的。我的问题是,让命令只保存棋盘图块的整数位置是否会被认为是不好的做法。

我的 Command 类代码的相关部分:

private GameController controller;
private Tile sourceTile;
private Tile[] route;

public MoveCommand(GameController controller, Tile sourceTile, Tile... route) {
    this.controller = controller;
    this.sourceTile = sourceTile;
    this.route = route;
}

@Override
public void execute() {
    controller.executeMove(sourceTile, route);
}

我打算将 Tile 引用更改为对称为 TileLocation 的新可序列化类的引用或类似的东西,它将保存一个 X 和 Y 整数,以便板可以找到瓷砖。

4

2 回答 2

1

将游戏状态和移动存储为整数并没有错。但我不建议将 java 序列化用于长期存储。(更新游戏类和重新读取保存的状态几乎是不可能的)。使用某种 XML 或 JSON 数据绑定(Jackson、GSON,无论你喜欢什么)来实现长期持久性。

于 2012-03-15T21:11:12.507 回答
0

我也反对序列化,而是选择 JSON 或 XML。但是,如果必须序列化,可以在任何成员变量上使用“transient”关键字,以防止它被包含在序列化中。

private transient int x = 0;

序列化对象时不会包含此特定变量。一般来说,将这些类型的字段标记为瞬态是一种很好的做法(即使您使用 JSON 或 XML),这样您就可以使用反射来发现要写出的对象的内容,而无需特定的业务逻辑来决定要保存哪些字段和哪个不保存。

于 2012-03-17T13:26:30.230 回答