什么是 serialVersionUID,我为什么要使用它?
技术问答
335 人阅读
|
0 人回复
|
2023-09-11
|
serialVersionUID缺少 a 时 Eclipse 会发出警告。$ q& ?" Q' A7 `. l; ~; o0 e
可序列化Foo 未声明 long 型静态终端 serialVersionUID 字段
# ]1 G* V0 n3 e& U, A" @什么是serialVersionUID为什么它很重要?请展示缺失serialVersionUID会导致问题的例子。
& w# {- ]* y. K/ [4 e; x8 ~+ T2 }9 U 0 C+ Y l* H" G- q$ B6 i
解决方案:
* [, o7 ]9 _* b s' C& D* { 文档java.io.Serializable可能与您得到的解释一样好:
; @9 B; K, ~8 j% {$ T3 V: [% D与每个可序列化类相关的版本号称为 a serialVersionUID,在反序列化期间,使用该版本号来验证序列化对象的发送者和接收者是否加载了与序列化兼容的类别。如果接收者为对象加载了一个类别serialVersionUID不同于相应发送者的类别,反序列化会产生 InvalidClassException. 可序列化类可以声明一个必须是 static、final 和 typeserialVersionUID显式声明自己的字段:serialVersionUID``long
/ I# `" J6 \9 Q% G. MjavaANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;; C; A& ?% o( D2 Q' S
如果可序列化类没有显式声明 a serialVersionUID,按顺序运行时,将按顺序运行serialVersionUID类别的各个方面都是默认值,如 Java(TM) 对象序列化规范中所述。强烈建议所有可序列化类都显式声明serialVersionUID因,因为默认serialVersionUID这些细节可能因编译器的实现而异,因此计算对类细节非常敏感InvalidClassExceptions在反序列化期间发生事故。因此,为了确保serialVersionUID不同 java 编译器实现的值一致,可序列化类必须声明显式serialVersionUID价值。强烈建议明确serialVersionUID尽量使用 声明private 修饰符,因为这种声明只适用于立即声明的类别——serialVersionUID作为继承成员,字段是无用的。 |
|
|
|
|
|