什么是serialVersionUID,为什么要使用它?推荐| Java Debug 笔记

2021/5/19 22:31:55

本文主要是介绍什么是serialVersionUID,为什么要使用它?推荐| Java Debug 笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

提问:什么是serialVersionUID,为什么要使用它?

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}很多的知识点,真的需要写出来才会掌握!!! 

serialVersionUID缺少a时,Eclipse会发出警告。

可序列化的类Foo没有声明类型为long的静态最终serialVersionUID字段

是什么serialVersionUID,为什么重要?请举一个示例,其中缺失serialVersionUID会导致问题

高分回答:

java.io.Serializable您可能会得到的有关docs的解释很好:

序列化运行时与每个可序列化的类关联一个版本号,称为serialVersionUID,在反序列化过程中使用该版本号来验证序列化对象的发送者和接收者是否已加载了该对象的与序列化兼容的类。如果接收者为对象加载的类serialVersionUID与相应的发送者的类不同,则反序列化将导致InvalidClassException。可序列化的类可以serialVersionUID通过声明一个serialVersionUID必须为static,final和type的字段来显式声明其自身long:

   ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
复制代码

如果可序列化的类未显式声明a serialVersionUID,则序列化运行时将根据serialVersionUID该类的各个方面为该类计算默认值,如Java™对象序列化规范中所述。但是,强烈建议所有可序列化的类都显式声明serialVersionUID值,因为默认serialVersionUID计算对类详细信息高度敏感,而类详细信息可能会根据编译器的实现而有所不同,因此可能导致InvalidClassExceptions反序列化期间发生意外情况。

因此,为了保证serialVersionUID不同Java编译器实现之间的值一致,可序列化的类必须声明一个显式serialVersionUID值。还强烈建议明确serialVersionUID声明在可能的情况下使用private修饰符,因为此类声明仅适用于立即声明的类-serialVersionUID字段作为继承成员没有用。

高分回答:

我不能错过这个机会来插上乔什·布洛赫(Josh Bloch)的著作《有效的Java》(第二版)。第11章是有关Java序列化的必不可少的资源。

根据Josh,自动生成的UID是基于类名称,已实现的接口以及所有公共成员和受保护成员生成的。以任何方式更改其中任何一项都会更改serialVersionUID。因此,仅在确定不会序列化不超过一个版本的类(跨进程或稍后从存储中检索)时,才不需要弄乱它们。

如果你忽略他们,现在,以后,你需要更改类以某种方式,但保持兼容性瓦特/旧版本的类,你可以使用JDK工具发现的serialver生成serialVersionUID对旧类,并明确设置在新班上。(根据您的更改,您可能还需要通过添加writeObject和readObject方法来实现自定义序列化-请参阅Serializablejavadoc或前面提到的第11章。)

文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/2…

作者建议:强烈建议在实体类或者需要传输的类上加上UID哦

IDEA快捷键: setting ->insp -> UID ->勾上

图片.png

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞???? 求关注❤️ 求分享???? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️



这篇关于什么是serialVersionUID,为什么要使用它?推荐| Java Debug 笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程