Java 关于游戏序列化的建议

Java 关于游戏序列化的建议,java,serialization,game-engine,Java,Serialization,Game Engine,我正在编写一个游戏。我知道序列化对于保存和多人游戏很有用。如果我在客户端选择多人游戏时强制更新,我看不出有任何理由使用serialversionuid 对于保存,我有一个问题:id是否会影响我将保存的游戏数据转换为新的游戏更新版本的能力?或者,所有这些都是基于逻辑的,将id作为手边游戏版本的简单参考 提前感谢所有人。如果我的代表更高,我会投票:P 编辑:两个答案都很有帮助。从他们那里,我收集了关于序列化和游戏编程的信息:拥有一个s-uid将是有益的,因为游戏中不同事物的不同版本将需要对其版本的引

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

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

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


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

是,
serialVersionUid
是一个哈希或版本,用于准确标识输出数据的
Serializable
类的哪个版本

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

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

要保证不同java之间的SerialVersionId值一致 在编译器实现中,可序列化类必须声明 显式SerialVersionId值

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

见:

  • java.io.ObjectInputStream
  • java.io.ObjectOutputStream
  • java.io.Externalizable

如果没有SerialVersionId,则会根据类结构计算SerialVersionId。在实践中,这意味着如果您稍微修改了类(可以包括不只是添加实例变量的内容,即您认为对序列化/反序列化不重要的内容),反序列化将失败,因为序列化对象的反序列化现在将生成一个serialVersionUID,该ID与为要将其水合到的类计算的serialVersionUID不同

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

(编辑-某个有帮助的人发布)