java - 保存程序的状态

标签 java serialization data-structures

我正在用java编写一个游戏。 现在我想添加一个功能来保存这个游戏的整个状态,以用于调试目的,并且我想自己编写这个,而不需要任何库。 我想到了几种可能的方法,但我不知道哪一种 我应该选择 - 所以我希望你能帮助我做出这个决定。

  1. 我可以创建一个 GameData - 类,将我需要的所有数据保存在此类的对象中,并使用 ObjectOutputStream 保存它。我对此解决方案的想法: 首先,几乎我的每个类都必须实现 Serializbale。这是不是有点丑陋的代码? 此外,这个 GameData 对象应该通过所有构造函数和对象传递,或者每个数据都应该设置为公共(public),以将数据保存在那里。 每次我更改游戏时,GameData 类以及处理它的所有代码都必须更改。

  2. 我可以用反射递归地遍历所有对象,直到到达原始类型或字符串,并将这些数据保存在树中..用反射再次重新构造它..但是..这可能吗还是我忘记了有一些问题吗?

你对此有何看法? 你还有其他想法吗?

最佳答案

有几个问题需要考虑: 您的对象图可能有循环,您必须以某种方式避免序列化对象两次。问题是在重建(加载)期间,您需要重新分配对象,即使它们尚未加载。您还需要对象标识符来执行此操作。 另一个问题是,您可能引用了不是您自己编写的类,并且这些类没有实现 SerializedExternalizable。您可能必须用自己的类替换它们。 另一个问题是考虑如果更改数据模型会发生什么。您将如何阅读旧的游戏存档?

如果您的对象图很小并且没有循环,那么选项 2) 可能是最好的。 否则我会考虑使用开源数据库。例如,您可以使用带有 O/R 映射层的关系数据库(本质上使它们看起来像对象数据库)。

我实际上写过一次自己的解决方案,它是一个名为 ZooDB (www.zoodb.org) 的实际对象数据库(不需要映射层)。它以嵌入式方式运行,即无需启动数据库服务器进程等。它还没有完全完成,但应该足以满足您的要求。

关于java - 保存程序的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539944/

相关文章:

algorithm - BuildHeap - Floyd 算法 - FixHeap 概念

java - 为可索引并发跳过列表实现交换方法

c++ - ‘t’ 声明中的两种或多种数据类型

java - 未记录的 API Sonar 规则在 sonarqube 6.5 中不起作用?

java - 从数组中的三个整数中找到可以得到的最高乘积 - 如何使用蛮力求解

c# - 在 C# 中向 Dictionary<string, T> 添加通用对象 - 空引用异常

c# - 保存 Winform 窗体控件状态的最佳方法?

java - 从 Java/Android 中的 Web 服务检索数据。 android.os.NetworkOnMainThreadException

java - Spring中的任务执行与调度

java - sonarQube - 使字段 transient 或可序列化