【问题标题】:Is this serialVersionUID a universal version identifier?这个 serialVersionUID 是通用版本标识符吗?
【发布时间】:2015-12-05 02:23:46
【问题描述】:

如果我使用 Eclipse IDE 生成的默认 serialVersionUID 如下

static final long serialVersionUID = 1L;

怎么可能是通用版? 如果是这样,为什么?怎么可能是通用版? 请大家解释一下!

【问题讨论】:

  • 什么是通用版本标识符?
  • 1.这个字段对序列化实现很重要(假设不是所有的实现) 2. 你使用的“版本”(通用版本)这个词是什么意思
  • 该字段在序列化/反序列化每个序列化类的对象时使用。所以这个字段的值需要是唯一的,我想大多数人都把这个字段用作“通用版本”。我说的对吗?
  • @StephenTunAung 它不需要是唯一的,它只需要在同一类的(序列化)不兼容版本之间是“唯一的”。
  • 非常感谢@MarkRotteveel 我应该通过它。

标签: java eclipse serialization java-io


【解决方案1】:

Javadocs 解释得很好:

序列化运行时与每个可序列化类关联 版本号,称为serialVersionUID,用于 反序列化以验证序列化的发送者和接收者 对象已加载与该对象兼容的类 关于序列化。如果接收者已经为 对象的 serialVersionUID 与 对应的发件人的类,然后反序列化将导致 无效类异常。可序列化的类可以声明自己的 通过声明一个名为的字段显式 serialVersionUID "serialVersionUID" 必须是静态的、最终的和 long 类型:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

如果一个可序列化的类没有显式声明一个 serialVersionUID,那么序列化运行时会计算一个 基于各个方面的该类的默认 serialVersionUID 值 类的,如 Java(TM) 对象序列化中所述 规格。但是,强烈建议所有 可序列化的类显式声明 serialVersionUID 值,因为 默认的 serialVersionUID 计算对类高度敏感 细节可能因编译器实现而异,并且可以 因此导致意外的 InvalidClassExceptions 在 反序列化。因此,要保证一致的serialVersionUID 跨不同 java 编译器实现的值,一个可序列化的 类必须声明一个显式的 serialVersionUID 值。也是 强烈建议显式 serialVersionUID 声明使用 可能的情况下使用私有修饰符,因为此类声明仅适用于 立即声明类--serialVersionUID 字段不是 作为继承成员有用。

也不错:Always Declare Serial Version Uid

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 2011-07-20
    • 2010-09-07
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多