[转]关于 "the serializable class XXX does not declare a static final seriaVersionUID..."的问题 (2012-03-1

本地部署llama3Chinese 这通常意味着你的构建环境可能不完整或者没有正确配置。通常是由 Visual Studio 的 C++ 工具提供的。(大模型对错误的解析)错误信息表明在尝试构建一个项目时,在 Windows 上, 阅读详情

[转]关于  "the serializable class XXX does not declare a static final seriaVersionUID..."的问题

  (2012-03-16 21:44:47)
标签: 

serializable

 

杂谈

分类: Java

关于myeclips提示The serializable class XXX does not declare static final serialVersionUID field of type long的警告

我们在用eclips/myeclips的时候,会出现这个warning,比如在用hibernate时,自动生成表的对应类后,就有这个提示。这是为什么呢?

这与jdk的版本没关系,那是Eclipse提供的功能.
你点它warning的icon两下Eclipse就会自动给定,如果你不喜欢,可以把它关掉,
windows  ->  preferences  ->  compiler  ->  Error/Warnings  ->  Potential  Programming  problems
将Serializable  class  without  serialVersionUID的warning改成ignore.

其实如果你没有考虑到兼容性问题时,那就把它关掉吧.
其实有这个功能是好的.只要任何类别实作了Serializable这个介面,
如果没有加入serialVersionUID,Eclipse都会给你warning提示,
这个serialVersionUID为了让该类别Serializable後兼容.

考虑一下,如果今天你的类Serialized存到硬碟里,
可是後来你却更改了类别的field(增加或减少或改名).
当你Deserialize时,就会出现Exception.这样就会做成不兼容性的问题.

但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize.

这个可以避开不兼容性的问题.

================================================================

【Ohters】

对于“the serializable class XXXXXXXX  does not declare a static final seriaVersionUID field of type long”的警告

系统一直会提示三种快速解决方案:

1.add default serial version ID

2.add generated serial version ID

3.add "Suppress Warnings"  'servial' to XXXXXXXX

 一、前言

SerialVersionUid,简言之,其目的是序列化对象版本控制,有关各版本反序列化时是否兼容。如果在新版本中这个值修改了,新版本就不兼容旧版本,反序列化时会抛出InvalidClassException异常。如果修改较小,比如仅仅是增加了一个属性,我们希望向下兼容,老版本的数据都能保留,那就不用修改;如果我们删除了一个属性,或者更改了类的继承关系,必然不兼容旧数据,这时就应该手动更新版本号,即SerialVersionUid。

关于其定义,可参考JDK文档:http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

二、问题

1.如果不显式设置SerialVersionUid,有什么后果?

jdk文档中有解释,建议我们显式声明,因为如果不声明,JVM会为我们自动产生一个值,但这个值和编译器的实现相关,并不稳定,这样就可能在不同JVM环境下出现反序列化时报InvalidClassException异常。

...it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations...

2.两种SerialVersionUid有什么区别?

在Eclipse中,提供两种方式让我们快速添加SerialVersionUid。

add default serial version ID:
Adds a default serial version ID to the selected type
Use this option to add a user-defined ID in combination with custom serialization code if the type did undergo structural change since its first release.

add generated serial version ID:
Adds a generated serial version ID to the selected type
Use this option to add a compiler-generated ID if the type didnot undergo structural change since its first release.

一种就是1L,一种是生成一个很大的数,这两种有什么区别呢?

看上去,好像每个类的这个类不同,似乎这个SerialVersionUid在类之间有某种关联。其实不然,两种都可以,从JDK文档也看不出这一点。我们只要保证在同一个类中,不同版本根据兼容需要,是否更改SerialVersionUid即可。

对于第一种,需要了解哪些情况是可兼容的,哪些根本就不兼容。 参考文档:http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf

在可兼容的前提下,可以保留旧版本号,如果不兼容,或者想让它不兼容,就手工递增版本号。

1->2->3.....

第二种方式,是根据类的结构产生的hash值。增减一个属性、方法等,都可能导致这个值产生变化。我想这种方式适用于这样的场景:

开发者认为每次修改类后就需要生成新的版本号,不想向下兼容,操作就是删除原有serialVesionUid声明语句,再自动生成一下。

个人认为,一般采用第一种就行了,简单。第二种能够保证每次更改类结构后改变版本号,但还是要手工去生成,并不是修改了类,会提示你要去更新这个SerialVersionUid,所以虽然看上去很cool,实际上让人很迷惑。

参考:

1.一篇较好的关于serialVesionUid的说明:

http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/

2.serialVesionUid相关讨论

http://stackoverflow.com/questions/888335/why-generate-long-serialversionuid-instead-of-a-simple-1l

3.compiler-generated ID生成算法

http://java.sun.com/javase/6/docs/platform/serialization/spec/class.html#4100

其他相关问题:

Hibernate的持久化,这个一般指的是将数据持久化到数据库,和序列化并没有直接关系。

Hibernate的POJO也并不要求必须实现Serializable接口,但是,作为系统扩展考虑,应该把PO都实现Serializable接口,因为如果这些对象需要缓存到磁盘上,或者在分布式环境下使用,就必须序列化,最常见的例子就是ehcache、Memcached。key和value中的对象都必须是序列化的对象。

 

PS:原文地址http://hi.baidu.com/wojiubaibudu/blog/item/67aeb196eba8837e55fb968b.html


Ubuntu 上 1Panel 的安装与高效运维实践 本文详细介绍了在Ubuntu系统上安装和高效运维1Panel面板的完整实践指南。内容涵盖了一键安装、Docker容器可视化部署、计划任务自动化以及网站数据库管理等核心功能,并提供了安全加固、资源监控与数据备份等进阶技巧,旨在帮助用户快速搭建并管理一个强大易用的服务器环境。 阅读详情

相关推荐

Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

我其实什么都不会 1605

关于"the serializable class XXXXXXXX does not declare a static final seriaVersionUID field of type long"

<br />对于“the serializable class XXXXXXXX  does not declare a static final seriaVersionUID field of type long”的警告<br />系统一直会提示三种快速解决方案:<br /> <br />1.add default serial version ID<br />2.add generated serial version ID<br />3.add "Suppress Warnings"  'servi

huangfudy的专栏 3151

097、Zephyr RTOS驱动开发实战:传感器驱动(陀螺仪)

I2C速率别设太高:LSM6DSO支持最高400kHz,但实际布线有寄生电容时,400kHz容易出错。工业产品我统一用100kHz,稳定压倒一切。FIFO水印值要计算:假设ODR=6.66kHz,每150us产生一组数据,如果水印设32组,则每4.8ms触发一次中断。这个间隔要大于I2C读取耗时(实测约200us),否则中断堆积。电源纹波敏感:陀螺仪对电源噪声敏感,特别是3.3V供电时。我遇到过因为DC-DC纹波太大,陀螺仪输出噪声从0.1dps飙升到2dps。

m0_50546716的博客 106

关于实现序列化的类提示没有定义serialVersionUID域

The serializable class XXX does not declare a static final serialVersionUID field of type longserialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式:一个是默认的1L,比如:pri...

简单就是美! 1034

KEPM :characteristic value xxxxxxxx does not exist for characteristic PRCTR

Error name : characteristic value xxxxxxxx does not exist for characteristic PRCTR in COPA or characteristi...

cuiyiyi0633的博客 848

解决办法:The serializable class XXX does not declare a static final serialVersionUID field of type long

今天在写java的时候遇到了一个警告,我自定义了一个异常类,继承Exception,然后eclipse就报警告了,这里说一下解决方法。 警告内容:The serializable class XXX does not declare a static final serialVersionUID field of type long 这个警告一般来讲不影响程序的运行,它的意思是:序列化类XXX...

嵌入式Linux充电站 1万+

实体类序列化 serialVersionUID 告警设置

在下图文件中设置 ,在新建实体类中若没有serialVersionUID 会做出提示

bingguang1993的博客 451

关于 "the serializable class XXX does not declare a static final seriaVersionUID..."问题

关于myeclips提示The serializable class XXX does not declare a static final serialVersionUID field of type long的警告 我们在用eclips/myeclips的时候,会出现这个warning,比如在用hibernate时,自动生成表的对应类后,就有这个提示。这是为什么呢? 这与jdk的版本没

涛行无疆的专栏 2万+

The serializable class XXX does not declare a static final seriaVersionUID field of type long

在Java类(或其父类)继承serializable 接口时,会出现“The serializable class XXX  does not declare a static final seriaVersionUID field of type long”警告,有三种快速解决方案: 1.add default serial version ID 2.add generated se

gnefniu的专栏 2294

the serializable class XXX does not declare a static final seriaVersionUID...问题

关于myeclips提示TheserializableclassXXXdoesnotdeclareastaticfinalserialVersionUIDfieldoftypelong的警告 我们在用eclips/myeclips的时候,会出现这个warning,比如在用hibernate时,自动生成表的对应类后,就有这个提示。这是为什么呢? 这与jdk的版本没关系...

weixin_30457065的博客 865

eclipse关于 "the serializable class XXX does not declare a static final seriaVersionUID..."问题

关于myeclips提示The serializable class XXX does not declare a static final serialVersionUID field of type long的警告 我们在用eclips/myeclips的时候,会出现这个warning,比如在用hibernate时,自动生成表的对应类后,就有这个提示。这是为什么呢? 这与jdk的版本没

qq280929090的专栏 1508

Scapy3.0 Documentation ( Adding new protocols )

说明:写到这里来,只是因为原文链接打开太慢了,至于翻译什么的就不误导大家了,还是原文好看原文链接:http://phaethon.github.io/scapy/api/build_dissect.html  Adding new protocolsNoteThis section has not been updated for scapy3k yet. Code examples may no...

天行健,君子以自强不息 826

载 关于SerializableserialVersionUID的作用和生成

在实现了Serializable接口的class中,需要声明一个long&amp;amp;nbsp;serialVersionUID,用来标明当前class的版本号,但很多人在编程时,总是不原意去声明这个serialVersionUID,又JVM自己来生成。下面来看看serialVersionUID的作用: 1、如果在序列化写&amp;amp;nbsp;时的版本号和序列化读&amp;amp;nbsp;时的版本号,不一致,将会有异常:java.i...

youyoum4a1的博客 1321

MantisBT:function.session-start错误

在服务器重启前一切正常,重启后出现Warning: session_start() [function.session-start]: open(XXXXXXXXsess_b96247f4835599b40e3e1a8af7b17d21, O_RDWR) failed: No such file or directory的红色警告.... 在服务器重启前一切正常,重启后出现 Warni

米菲的泰迪 862

数字滚动效果

* 没有这个属性的话能看到全部数字上下滚动 */// 创建span节点。// 如未满5位数,在前面补位"0"// 生成0-99999随机数。// 根据实际情况确定几位数。// 设置每一位数字的偏移。

fanfan176的博客 1万+

异常警告The serializable class DBServlet does not declare a static final serialVersionUID

异常警告The serializable class DBServlet does not declare a static final serialVersionUID The serializable class XXX does not declare a static final serialVersionUID field of type long serialVersionUID

wangfengtong的博客 6219

【Java学习001】Java-HashMap源码详解

详解HashMap源码

pcx171的博客 423

Java警告The serializable class XXX does not declare a static final serialVersionUID field of type long

警告原因: 当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义之 解决方法: 很多时候是用Eclipse自动生成一个UID 详细解释博客推荐: 关于The serializable class XXX does not declare a static final serialVersionUID field of type long的警告_virgoboy2004的专栏-CSDN博客 Eclipse警告:Th

黄佳俊的博客 1542

JDK1.8源码笔记(4) Serializable

关于Serializable Serializability of a class is enabled by the class implementing the java.io.Serializable interface. 一个类序列化的能力通过实现java.io.Serializable接口可以开启。 Classes that do not implement this interf...

lalala_HFUT的博客 584

Docker安装Nginx|Docker容器常见故障排查||Conflict. The container name “xxxx“ is already user

Docker安装最新稳定版Nginx Error response from daemon: Conflict. The container name "/my-nginx" is already in use by container 解决方案

天涯芳草 2万+

基于C8051F320单片机的低成本心电监护系统设计

介绍一种基于C8051单片机的动态心电监护系统。该系统由两部分组成:以C8051F320单片机为核心的数据采集装置和以PC机为平台的分析处理系统。硬件电路功耗低,由单片机自带的USB接口将数据传送给PC机。软件平台采用LabVIEW可视化虚拟仪器系统开发平台,将传统仪器的功能模块集成到计算机中,用户可通过修改虚拟仪器的程序改变其功能。采用USB接口实时传输心电数据,并将数据采集模块设计为计算机外设,使该系统高速快捷、小巧便携。

matlab飞行轨迹代码-alfa-dataset:阿尔法数据集

matlab飞行模拟代码AirLab故障和异常(ALFA)数据集航空实验室故障和异常(ALFA)数据集包括从数十次自主飞行中收集的数据,用于故障检测和异常检测研究。数据在4个集合中提供:-处理的数据:47个完全自主的飞行序列序列,在飞行过程中发生了八种不同类型的故障。这些文件包括类型的基本事实和故障时间,并以ROS.bag格式以及.csv和.mat格式提供。原始.bag文件使用修改后的ROS包记录,通过协议连接到运行修改后的Ardupilot3.9.0beta1的Pixhawk。-原始行李文件:航班的原始.bag文件。它包含在飞行过程中收集的手动和自主飞行序列,未经任何处理。这些文件是使用连接到Pixhawk的修改后的ROS包记录的,该Pixhawk通过协议运行修改后的Ardupilot3.9.0beta1-遥测日志:来自连接到Pixhawk自动驾驶仪的机载NVidiaTX2计算机的遥测日志。-Dataflash日志:飞行期间记录在Pixhawk上的日志。提供了用于在C++、Py

上一篇: HTML <frameset> 标签的 cols 属性和 rows 属性
下一篇: JAVA里面GridLayout的作用
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值