我正在用java编写一个游戏。 现在我想添加一个功能来保存这个游戏的整个状态,以用于调试目的,并且我想自己编写这个,而不需要任何库。 我想到了几种可能的方法,但我不知道哪一种 我应该选择 - 所以我希望你能帮助我做出这个决定。
我可以创建一个 GameData - 类,将我需要的所有数据保存在此类的对象中,并使用 ObjectOutputStream 保存它。我对此解决方案的想法: 首先,几乎我的每个类都必须实现 Serializbale。这是不是有点丑陋的代码? 此外,这个 GameData 对象应该通过所有构造函数和对象传递,或者每个数据都应该设置为公共(public),以将数据保存在那里。 每次我更改游戏时,GameData 类以及处理它的所有代码都必须更改。
我可以用反射递归地遍历所有对象,直到到达原始类型或字符串,并将这些数据保存在树中..用反射再次重新构造它..但是..这可能吗还是我忘记了有一些问题吗?
你对此有何看法? 你还有其他想法吗?
最佳答案
有几个问题需要考虑:
您的对象图可能有循环,您必须以某种方式避免序列化对象两次。问题是在重建(加载)期间,您需要重新分配对象,即使它们尚未加载。您还需要对象标识符来执行此操作。
另一个问题是,您可能引用了不是您自己编写的类,并且这些类没有实现 Serialized
或 Externalizable
。您可能必须用自己的类替换它们。
另一个问题是考虑如果更改数据模型会发生什么。您将如何阅读旧的游戏存档?
如果您的对象图很小并且没有循环,那么选项 2) 可能是最好的。 否则我会考虑使用开源数据库。例如,您可以使用带有 O/R 映射层的关系数据库(本质上使它们看起来像对象数据库)。
我实际上写过一次自己的解决方案,它是一个名为 ZooDB (www.zoodb.org) 的实际对象数据库(不需要映射层)。它以嵌入式方式运行,即无需启动数据库服务器进程等。它还没有完全完成,但应该足以满足您的要求。
关于java - 保存程序的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539944/