0

我正在编写游戏代码。我知道序列化对于保存和多人游戏很有用。如果在客户端选择多人游戏时强制更新,我看不出有任何理由使用 serialversionuid。

对于保存,我有一个问题:id 是否会影响我将保存的游戏数据转换为游戏的新更新版本的能力?或者这一切都是基于逻辑的,让 id 作为手头游戏版本的简单参考?

提前感谢任何人。如果我的代表更高,我会投票:P

编辑:两个答案都非常有帮助。从他们那里,我收集到关于序列化和游戏编程的信息:拥有 s-uid 将是有益的,因为游戏中不同事物的不同版本将需要对其版本的引用,以便能够在不同版本之间具有兼容性或不兼容性。一个“游戏版本 ID”是不够的信息。谢谢大伙儿解惑!

4

2 回答 2

1

是的,serialVersionUid旨在作为一个哈希或版本,准确标识Serializable数据是由哪个版本的类输出的。

不幸的是,它主要作为序列化的障碍——通过导致每一个微小的变化来破坏序列化。任何不同的版本都会引发异常。

推荐的做法是在您的 java 源代码中生成或分配一个serialVersionUid常量,以避免不必要的不​​兼容。来自 Javadoc:

为了保证不同 java 编译器实现的 serialVersionUID 值一致,可序列化类必须声明一个显式的 serialVersionUID 值。

如果您深入研究 Java 源代码,您可能能够找到实现/覆盖的方法,这可以让您更好地控制序列化。

看:

  • java.io.ObjectInputStream
  • java.io.ObjectOutputStream
  • java.io.Externalizable
于 2013-07-20T01:17:14.030 回答
1

发生的情况是,如果您没有 serialVersionUID,则会根据类结构计算。实际上,这意味着如果您稍微更改类(其中可能包括不简单地添加实例变量的东西,即您认为对序列化/反序列化不重要的东西),您的反序列化将失败,因为您的序列化的反序列化对象现在将产生一个 serialVersionUID,它不同于为您将其水合到的类计算的那个。

简单的答案就是声明一个。如果你这样做,java 将使用声明的,并且你的序列化对变化不会那么敏感。请注意,您仍然可以通过添加/删除实例变量来破坏它,但它会更加健壮。它是什么也没关系 - 它不需要匹配从 serialversiontool 生成的 long,使用 1 或任何其他 long 是完全安全的,只要你在对类进行重大更改时更改它.

(编辑-SO上的一些有用的人在此处发布了有关如何计算serialVersionUID的参考

于 2013-07-20T01:20:34.050 回答