为什么用户定义的serialVersionUID在去电时不使用?

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; 本地类不兼容:stream classdesc serialVersionUID = -342194960183674221,本地类serialVersionUID = -8890407383319808316

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

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

静态最终Long serialVersionUID = 1L;


再看一遍。 'Long'与'long'不一样,1L与-342194960183674221L不一样,这就是流中的内容。


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

static final long serialVersionUID = 1L;

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

请参阅Java对象序列化规范部分4.6。


serialVersionUID是其原始类的散列。 如果类更新,例如使用不同的字段,则serialVersionUID可以更改。 你有四个(至少)可能的行动方案:

  • 省略serialVersionUID。 这告诉运行时,序列化和反序列化时类之间没有区别。
  • 总是写一个默认的serialVersionUID,看起来像这个线程的标题。 这告诉JVM,具有此serialVersionUID的所有版本都计为相同版本。
  • 从以前版本的类复制serialVersionUID。 这告诉运行时,这个版本和SUID来自的版本将被视为相同的版本。
  • 为每个版本的类使用生成的serialVersionUID。 如果serialVersionUID在新版本的类中不同,它告诉运行时,两个版本不同,旧类的序列化实例不能反序列化为新类的实例。
  • 资源 :

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

    链接地址: http://www.djcxy.com/p/23867.html

    上一篇: why user defined serialVersionUID is not used while desialization?

    下一篇: serialversionuid is static and final but then why is it serializable