关于游戏序列化的建议

时间:2013-07-20 01:12:51

标签: java serialization game-engine

我正在为游戏编码。我知道序列化对于保存和多人游戏很有用。如果我在客户选择多人游戏时强行更新,我就没有理由使用serialversionuid。

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

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

编辑:两个答案都非常有用。从他们那里,我收集了关于序列化和游戏编程的内容:拥有一个s-uid将是有益的,因为游戏中不同版本的不同版本需要引用他们的版本才能兼容或不兼容版本。 One"游戏版本ID"信息不足。谢谢你们澄清一下!

2 个答案:

答案 0 :(得分:1)

是的,serialVersionUid旨在成为一个哈希或版本,用于准确识别Serializable类的哪个版本,数据输出为。

不幸的是,它主要是阻止序列化 - 通过导致每次微小的改变来打破序列化。任何不同的版本都会导致抛出异常。

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

  

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

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

请参阅:

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

答案 1 :(得分:1)

如果您没有serialVersionUID,则会根据类结构计算出来。在实践中,这意味着如果你稍微改变了类(可以包括那些不简单地添加实例变量的东西,即你认为对于序列化/反序列化不重要的事情),你的反序列化将会失败,因为序列化的反序列化对象现在将产生一个与你为其保湿的类计算的不同的serialVersionUID。

简单的答案就是宣布一个。如果你这样做,java将使用声明的序列化,你的序列化将不会对更改敏感。请注意,您仍然可以通过添加/删除实例变量来破坏它,但它会更强大。它也无关紧要 - 它不需要匹配serialversiontool生成的long,使用1或任何其他long是完全安全的,只要你改变它就可以改变它

(编辑 - 发布了this reference on how the serialVersionUID is calculated here的一些有用的人士)