我正在用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整数,以便委员会可以找到它。
答案 0 :(得分:1)
存储游戏状态和整数移动没有错。但我不建议使用java序列化进行长期存储。 (更新游戏几乎是不可能的 类和重读已保存的状态)。使用某种XML或JSON数据绑定(Jackson,GSON,无论你喜欢什么)来实现长期持久性。
答案 1 :(得分:0)
我也会反对序列化,而是选择JSON或XML。但是,如果必须序列化,则可以在任何成员变量上使用“transient”关键字,以防止它包含在序列化中。
private transient int x = 0;
序列化对象时不会包含此特定变量。一般来说,这是一种很好的做法(即使您使用JSON或XML)将这些类型的字段标记为瞬态,因此您可以使用反射来发现要写出的对象的内容,而无需使用特定的业务逻辑来确定要保存的字段和哪个不救。