保存/加载具有依赖项的对象的强大方法?

时间:2010-03-11 16:34:31

标签: java android

我正在用Java编写Android游戏,我需要一种强大的方法来快速保存和加载应用程序状态。这个问题似乎适用于大多数OO语言。

要了解我需要保存的内容:我正在使用策略模式来控制我的游戏实体。这个想法是我有一个非常通用的实体类,例如存储子弹/玩家/敌人的位置,然后我附上一个行为类,告诉实体如何行动:

class Entiy { float x; float y; Behavior b; }

abstract class Behavior { void update(Entity e); {}

// Move about at a constant speed
class MoveBehavior extends Behavior { float speed; void update ... }

// Chase after another entity
class ChaseBehavior extends Behavior { Entity target; void update ... }

// Perform two behaviours in sequence
class CombineBehavior extends Behavior { Behaviour a, b; void update ... }

实质上,Entity对象很容易保存,但是Behavior对象可以有一个半复杂的图形,表示其他Entity对象和其他Behavior对象之间的依赖关系。我还有一些行为在实体之间共享的情况。我愿意改变我的设计以使保存/加载状态更容易,但上述设计非常适合构建游戏。

无论如何,我考虑过的选项是:

  • 使用Java序列化。这在Android中意味着非常慢(我会在某个时候对其进行分析)。然而,当版本之间发生变化时,我担心它的稳健性。

  • 使用JSON或XML之类的东西。我不知道如何应对存储对象之间的依赖关系。我是否必须为每个对象提供一个唯一的ID,然后在加载时使用这些ID将正确的对象链接在一起?我以为我可以更改ChaseBehaviour以将ID存储到实体而不是引用,该实体将用于在执行行为之前查找实体。

我宁愿避免自己编写大量的加载/保存代码,因为我发现它很容易出错(例如忘记保存某些内容,以错误的顺序读出内容)。

任何人都可以向我提供有关保存的优质格式或类设计的任何提示,使保存状态更容易吗?

2 个答案:

答案 0 :(得分:1)

在使用之前一定要检查序列化。我不知道它在Android上的表现如何,但对于Java代码,它是保存对象图形的一种已知且有效的方法。无论如何,您还可以查看对{​​{3}}的回复,该回复考虑使用XML保存对象图。

答案 1 :(得分:0)

您还没有说为什么要保存/加载状态。如果你想防止关机, 您可能希望使用Bundle和PathClassLoader以及onSaveInstanceState和onRestoreInstanceState / onCreate。