【问题标题】:Store version number in java object在 java 对象中存储版本号
【发布时间】:2024-04-21 12:10:02
【问题描述】:

我目前正在编写一个带有点对点“网络协议”的 java 游戏。这意味着我通过网络将对象发送到其他游戏。

随着开发的进行,我会添加和删除东西。我改变了游戏,它最终变得与旧版本不兼容。

现在我想将当前版本号存储在我通过网络发送的协议对象中,每次我进行更改时,我都可以更新版本,从而在代码中检测两个游戏实例是否兼容。

我的问题是:java中保存版本号的标准类是什么?

我搜索可以为我提供主要、次要和补丁级别版本、可比较等的东西。

这样的课程很难用谷歌搜索..

【问题讨论】:

  • 不完全确定,但您可以使用public static final int version 字段。
  • 实现 java.io.Serializable 并创建字段 generatedGUID。当您更改课程时,guid 应该更改
  • 当您说您通过网络协议发送对象时,您的意思是: 1. 您使用类似ObjectOutputStream 的东西通过网络连接发送数据? 2. 您正在创建自己的对象以通过网络发送?如果是这种情况,您正在创建自己的应用层网络通信标准,并在其中定义标准。当人们检查版本号时,单个整数的传输就足够了,不需要特殊的对象。如果您的游戏要求特定对象担任此角色,请创建您自己的对象。
  • 是的,就像你描述的那样。毫无疑问,一个简单的整数来存储版本就可以了。但它的 Java 和它的一个学校项目。我想用一个不错的版本对象来制作它。这是一些非常基本的东西,而且很容易实现,所以我很确定核心中一定有类似的东西。
  • 嗯,在我看来,明确地必须传输一个代表版本的整个对象是糟糕的程序设计的标志。版本号应该是内置消息包或初始连接握手期间。但是,除此之外,通过序列化(本质上是当对象准备好传输/存储时 java 正在为您做的事情),java 自动为每个类提供一个“版本”,存储为字段serialVersionUID。你能不能简单地用每个不兼容的游戏版本更改 UID 并在读取对象时检测到ClassCastException

标签: java version standard-library


【解决方案1】:

版本控制机制取决于您使用的序列化机制。如果您使用标准 java 序列化,则 @​​987654321@ 表示类的版本。 您指定主要、次要和补丁级别的选项相当有限,因为 serialVersionUID 是 long

【讨论】:

  • 哦,这就是他对这个生成的GUID 字段的意思。也许我会同意,但我仍在寻找那个标准版本的对象。
  • 我很确定没有在java中保存版本号的标准类这样的东西。我仍然不太确定你想要实现什么.您是否正在尝试实现某种握手机制来确定 2 个客户端是否可以相互通信?或者您是否正在寻找一种方法来对您通过网络发送的每个 数据对象 进行版本化,然后查看其他客户端是否可以解释它?
【解决方案2】:

AFAIK,在您的消息中明确包含协议版本号是一种标准做法。我建议对该字段使用字符串,因为数字字段通常过于严格(此外,现在使用字符串似乎是事实上的标准)。

这通常比对象上的版本更好,因为对象上的版本不一定与 协议 是否兼容。

如果您将 Java 序列化用于消息序列化,则事情可能会变得有点复杂,因为 Java 序列化有自己的版本控制方案。你可以使用它,但使用独立的序列化协议(如 JSON、XML、protobuf 等)可能更容易

【讨论】: