gpt4 book ai didi

java - 为什么反序列化时不使用用户定义的serialVersionUID?

转载 作者:行者123 更新时间:2023-12-01 23:25:47 25 4
gpt4 key购买 nike

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; local class incompatible: stream classdesc serialVersionUID = -342194960183674221, local class serialVersionUID = -8890407383319808316

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

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

static final Long serialVersionUID = 1L;

最佳答案

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

static final long serialVersionUID = 1L;

仅当未显式且正确声明 UID 时,才会在运行时动态计算 UID。

引用Java Object Serialization Specification section 4.6 .

关于java - 为什么反序列化时不使用用户定义的serialVersionUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20028186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com