为什么用户定义的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可以更改。 你有四个(至少)可能的行动方案:
资源 :
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