0

老实说,我不太确定从哪里开始这个问题。我将描述这种情况:我正在为 HTML5 游戏制作关卡编辑器。关卡编辑器已经可以使用了——现在我想保存/加载用这个编辑器创建的关卡。

由于这一切都是在 Javascript 中完成的(关卡编辑器和游戏),我正在考虑让保存简单地将关卡转换为 JSON 并加载,嗯......取消 jsonify 它。

问题是 - 关卡包含几种类型的对象(几种不同类型的实体,几种类型的动画对象等......)现在,每次我想向游戏中添加一个对象时,我都必须编写一个 unjsonify 方法专门针对该对象,然后修改关卡对象的 unjsonify 方法,以便它可以处理 unjsonifying 新定义的对象类型。

我不能简单地使用 JSON.parse,因为它只返回一个与原始对象具有相同键和值的对象,但它实际上并不是该类/原型的对象。那么,我的问题是,是否有一种正确的方法来做到这一点,而无需每次我想向游戏中添加新类型的对象时都必须不断修改代码?

4

1 回答 1

0

我会在每个对象上创建序列化/反序列化方法,以将它们的状态放入 JSON 对象并从中恢复。复合对象将递归地序列化/反序列化它们的子对象。举个例子:

function Player {
  this.weapon = new Weapon();
}

Player.prototype.serialise = function () {
  return {'type': 'Player', weapon: this.weapon.serialise()};
}

Player.deserialise = function(json_object) {
  var player = new Player();
  player.weapon = Weapon.deserialise(json.weapon);
  return player;
}

显然,在实际代码中,您将进行检查以确保您获得了您期望的对象类型。数组和简单的散列对象可以在序列化/反序列化期间简单地复制,尽管它们的子对象通常需要递归。

于 2012-08-06T09:37:59.980 回答