【问题标题】:what is the different between default and generated serial version uid in java?java中默认和生成的serialversionuid有什么区别?
【发布时间】:2017-06-19 04:39:30
【问题描述】:

我不知道在哪里使用 default serialVersionUID 或在 java 中生成的 serialVersionUID

private static final long serialVersionUID = 4125965356358329466L; // generated
private static final long serialVersionUID = 1L; // default

【问题讨论】:

标签: java serialization deserialization serialversionuid


【解决方案1】:

序列版本 ID 用于序列化和反序列化对象。 Java 识别您要反序列化的字节是否与本地类版本匹配,否则将引发异常。 这在执行 RMI 或持久化对象结构时很重要。 序列化运行时与每个可序列化类关联一个版本号,称为 serialVersionUID, 它在反序列化期间用于验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。

【讨论】:

  • 我知道什么是verison id,但是这两者有什么区别?
【解决方案2】:

如果您自己没有为Serializable 类提供serialVersionUID,那么Java 会根据该类的详细信息为您生成一个。一些 IDE 和其他工具可以执行相同的计算,以使您能够将生成的 serialVersionUID 显式放入您的类中。如果您想对类进行更改,同时保持与旧版本的序列化兼容性,这样做很有用——在大多数情况下,这有点棘手,但通常是可行的。

另一方面,如果您手动管理serialVersionUID,那么使用普通序列号会容易得多,从 1(或您选择的其他数字)开始,并在课程结束时递增以破坏序列化兼容性的方式进行更改。但是,如果您要为此烦恼,那么请确保正确地进行操作 - 也就是说,在适当的时候更改serialVersionUID - 否则您会破坏整个目的。 p>

【讨论】:

  • 依赖于默认的 id 生成会暴露你在实现上的差异;您必须确定序列化器和反序列化器使用相同的 JVM 提供程序/版本。
  • 不是这样,@JanLarsen。计算默认serialVersionUID 的算法是标准化的。正如java.io.Serializable 的文档所说,“如果可序列化的类没有显式声明 serialVersionUID,那么序列化运行时将根据类的各个方面为该类计算默认的 serialVersionUID 值,如Java(TM) 对象序列化规范”(强调)。具体见docs.oracle.com/javase/7/docs/platform/serialization/spec/…
【解决方案3】:

没有实际区别。换班的时候只要把数字改(加)一下就OK了。

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2020-10-28
    • 2015-03-06
    • 2020-08-21
    • 2011-04-03
    相关资源
    最近更新 更多