1

我用 Java 编写了一个数学游戏,并分发了一些副本给一些 beta 测试人员。问题是我给他们的版本是通过对象序列化保存 GameData,我发现这主要是为了通过网络发送对象,或者在这种情况下,是 GameData 的 ArrayLists。这不是持久性;这就是关系数据库的用途。知道了这一点,我想知道是在beta-tester的机器上创建一个数据库(并重写游戏)更好,还是继续游戏的对象序列化版本,然后在准备好时检索对象发送数据?

我的猜测是将他们的数据移动到在他们的计算机上创建的数据库中,然后给他们游戏的数据库版本。这样,数据可以被持久化并且更容易操作。让我远离这个想法的是我将如何将他们的数据库写入我的数据库(将来)?

4

4 回答 4

2

虽然比较少见,但仍有许多应用程序使用序列化来存储和检索对象。这样做并没有,只是有点不寻常。如果它对您有用,请坚持使用它,因为 DB 是一种重量级的解决方案。您发现的关于序列化的内容只是一种观点,而且是一种错误的观点。

于 2013-06-08T23:34:38.933 回答
1

在使用嵌入式数据库方面,需要考虑的两个选项是SQLiteHyperSQL。但是,序列化也是一种选择,在我看来,如果您已经实现了它,它应该是您的默认选项。一些考虑:

  1. 使用序列化,您通常必须检索整个对象,如果您有一个包含几十个字段的对象并且您只想读取其中一个字段,这会很慢。如果您要进行此类查询,请使用数据库。我怀疑您只是在启动时读取所有序列化对象并在关闭时将它们序列化回磁盘,在这种情况下,没有理由使用数据库而不是序列化。
  2. Java 的默认序列化机制相当慢。您可能需要考虑另一种序列化机制,例如KryoJackson,但前提是您对程序的序列化性能不满意。
于 2013-06-08T23:44:17.140 回答
1

在不知道您坚持什么以及为什么坚持的情况下,很难就最佳技术选择提出建议。

  • 如果状态只是游戏状态的快照(即保存文件)或“最佳分数”表,那么您不需要数据库。使用 JSON、XML 或...进行序列化 Java 对象序列化就足够了。

  • 如果需要以增量方式读取或更新状态或与其他应用程序...或其他机器上的用户共享状态...那么数据库更合适。

    如果需求包括增量更改等,则序列化机制是有问题的。您最终会在序列化的顶部构建一个类似数据库的层。


至于您是否应该坚持使用 Java 序列化......还是切换到 JSON 或 XML 或类似的东西:

  • 对象序列化很简单,但如果您更改要序列化的类,它可能会很脆弱。这种脆弱性可以得到缓解,但它很混乱,而且你失去了简单性。(您需要编写自定义readObjectwriteObject知道如何读取序列化对象的“旧版本”的方法。)

  • JSON 和 XML 稍微复杂一些,但如果使用对象绑定机制,仍然相对简单。

值得注意的是,无论您做什么,对持久对象类(或数据库模式)的更改都可能存在问题。这个问题没有简单的通用解决方案。


更新

鉴于您在第一条评论(如下)中提供的其他信息,您似乎不需要游戏本身的数据库。您所需要的只是可以读取和分析您的 beta 测试人员为您提供的会话状态保存文件的东西。事实上,看起来实际的应用程序甚至不需要能够读取文件。(但这还不清楚,因为你没有说这些文件的真正目的是什么......或者至少,没有说整个目的是什么。)

还值得注意的是,如果您的目标是调整问题集,您可能会保存错误的信息。您真正需要做的是记录时间长度以及用户是否得到正确或错误答案以及时间......对于每个单独的问题。而且您可能需要知道给出的实际答案是什么……以便您可以发现用户的答案实际上是正确的并且您将其“标记”为错误的情况……反之亦然。

“让我远离这个想法的是我将如何将他们的数据库写入我的数据库(在未来)?”

确切地。如果你没有过早地“分析”数据,你就不会有这个问题。

但忽略这一点,一个简单的状态保存机制似乎足以满足您(仍然是假设/推断的)为最终用户保留个人记分板的要求。使用自定义日志文件可以更好地实现您的“调整”内容。我看不出将数据库合并为应用程序本身的任何价值。

于 2013-06-09T00:15:51.247 回答
0

我想你正在做java序列化,如果是这样就没有问题了。请注意它的限制 - 不同版本的 java 可能无法检索文件。此外,如果更改类别,则无法检索以前保存的数据。

如果您决定更改,您可以查看 Xml、JSon、Protocol Buffers、Thrift、Avro 等以及数据库。

笔记:

  Xml is builtin in to java 
  Java Db (Derby) is also in Java

其他序列化模式需要单独的库。

于 2013-06-08T23:45:21.140 回答