2013-07-20 43 views
0

我正在编写游戏。我明白,序列化对保存和多人游戏很有用。如果我在客户端选择多人游戏时强制更新,我认为没有任何理由使用serialversionuid。关于游戏序列化的建议

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

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

编辑:两个答案都非常有帮助。从他们中,我收集了关于序列化和游戏编程的内容:拥有s-uid将会有所帮助,因为游戏中不同版本的不同版本需要参考其版本才能在各个版本之间兼容或不兼容。一个“游戏版本ID”不足以提供信息。感谢澄清家伙!

回答

1

是的,serialVersionUid旨在是一个散列或版本,可以精确地标识数据是由哪个版本的Serializable类输出的。

不幸的是,它主要是作为序列化的障碍 - 通过引起每一次小的改变破坏序列化。任何不同的版本都会导致抛出异常。

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

为了保证跨不同的Java编译器 实现一致的serialVersionUID值,序列化类必须声明一个明确的 的serialVersionUID值。

如果你深入到Java源代码可能能够找到方法来实现/重写,它可以让您对序列化的更多控制。

参见:

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

什么情况是,如果你没有一个serialVersionUID是基于类结构计算的。在实践中,它意味着如果你稍微改变了类(可以包括那些不会简单地添加实例变量的东西,也就是说,你认为对于序列化/反序列化不重要的东西),你的反序列化将失败,因为序列化的反序列化对象现在将产生一个serialVersionUID,其不同于,它与您为其保湿的课程计算出的值不同。

简单的答案就是申报一个。如果你这样做,java将使用声明的序列化,并且序列化不会对变化敏感。请注意,您仍然可以通过添加/删除实例变量来分解它,但它会更加健壮。它也无所谓 - 它不需要与serialversion工具生成的长度相匹配,使用1或任何其他长整数是完全安全的,只要您在对类进行重大更改时进行更改。

(编辑 - SO上的一些有用的人张贴this reference on how the serialVersionUID is calculatedhere