【问题标题】:why user defined serialVersionUID is not used while desialization?为什么反序列化时不使用用户定义的serialVersionUID?
【发布时间】:2013-11-30 10:42:36
【问题描述】:
public class Employee2 implements java.io.Serializable {


    private String name;

    public String getName() {
    return name;
}


public void setName(String name) {
    this.name = name;
}

}

我首先序列化了 Employee2 对象。然后在 Employee2 下添加了一个字段,即年龄。现在反序列化Employee2并得到以下错误

java.io.InvalidClassException: Test.Employee2;本地班 不兼容:流 classdesc serialVersionUID = -342194960183674221, 本地类serialVersionUID = -8890407383319808316

这是预期的,因为类的结构已被修改(因此 serialVersionUID 已修改,这是在序列化时内部计算的 和反序列化)

现在,如果我在 Employee2 下声明以下字段并重复该场景,根据我的理解,我不应该得到 InvalidClassException,因为 serialVersionUID 在序列化和反序列化时是相同的,但我仍然收到 InvalidClassException 异常。为什么?如果序列化 进程仍然使用在运行时计算的serialVersionUID,而不是在类下手动定义,那么声明它有什么用?

static final Long serialVersionUID = 1L;

【问题讨论】:

    标签: java serialization serialversionuid


    【解决方案1】:

    您正在使用Long,对象类型。你应该使用long,原始类型,例如:

    static final long serialVersionUID = 1L;
    

    只有在没有明确且正确声明的情况下,UID 才会在运行时动态计算。

    请参阅Java Object Serialization Specification section 4.6

    【讨论】:

      【解决方案2】:

      再看一遍。 “Long”与“long”不同,1L 与流中的 -342194960183674221L 不同。

      【讨论】:

      • OP 在尝试添加 UID 后重复了完整的序列化 + 反序列化过程。 -342194960183674221L 是与 1L 不同的示例的一部分。
      • @JasonC OP 没有成功添加 UID,因为他使用 Long 而不是 long
      • 世界上最慢的对话,哈哈。我会在 6 到 8 年后回复你。
      【解决方案3】:

      serialVersionUID 是其原始类的哈希值。如果类被更新,例如使用不同的字段,serialVersionUID 可能会改变。您有四种(至少)可能的行动方案:

      1. 省略serialVersionUID。这告诉运行时在序列化和反序列化时类的版本之间没有差异。
      2. 总是写一个默认的serialVersionUID,它看起来像这个线程的标题。这会告诉 JVM,具有此 serialVersionUID 的所有版本都算作同一版本。
      3. 从该类的先前版本复制一个 serialVersionUID。这告诉运行时这个版本和 SUID 来自的版本将被视为相同的版本。
      4. 为每个版本的类使用生成的serialVersionUID。如果类的新版本中的 serialVersionUID 不同,这会告诉运行时这两个版本不同,并且旧类的序列化实例不能反序列化为新类的实例。

      来源:

      http://www.coderanch.com/t/596397/java/java/private-static-final-long-serialVersionUID

      【讨论】:

      • 只有第 (2) 项有意义,或者 (3) 如果您忘记了。
      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 2012-09-05
      • 2017-07-15
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多