serialVersionUID作用

serialVersionUID作用

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

原文出处:未知

Java的序列化机制是通过在执行时推断类的serialVersionUID来验证版本号一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地对应实体(类)的serialVersionUID进行比較,假设同样就觉得是一致的,能够进行反序列化,否则就会出现序列化版本号不一致的异常。 

Eclipse中The serializable class XXXXXX does not declare a static final serialVersionUID field of type long出现这种警告处理办法。 

当採用程序的Add default Serial version ID修复时,Eclipse会加上:private static final long serialVersionUID = 1L; 

当採用程序的Add generated Serial version ID修复时,Eclipse会加上:private static final long serialVersionUID = xxxxL; 

事实上这个问题出现的详细原因是和序列化中的这个serialVersionUID有关。 

serialVersionUID 用来表明类的不同版本号间的兼容性。有两种生成方式: 

一个是默认的1L,比方:private static final long serialVersionUID = 1L;(相应修复方法1) 

一个是依据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比方: 
private static final long serialVersionUID = xxxxL;(相应修复方法2) 

在JDK中,能够利用JDK的bin文件夹下的serialver.exe工具产生这个serialVersionUID 的值,对于Test.class,运行命令: 
serialver Test   这时JVM(java虚拟机)会生成一个哈希字段。 

对照一下这个哈希字段的值与方法2中生成的字段值是一样的,可见,在CMD中使用serialver指令就是依据类名、接口名、成员方法及属性等来生成哈希字段的。 

以下来讨论java类中为什么须要重载 serialVersionUID 属性。 

当两个进程在进行远程通信时,彼此能够发送各种类型的数据。不管是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方须要把这个Java对象转换为字节序列,才干在网络上传送;接收方则须要把字节序列再恢复为Java对象。 

  把Java对象转换为字节序列的过程称为对象的序列化。 

  把字节序列恢复为Java对象的过程称为对象的反序列化。 

  对象的序列化主要有两种用途: 

  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件里; 

  2) 在网络上传送对象的字节序列。 

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对參数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 

java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。 

仅仅有实现了Serializable和Externalizable接口的类的对象才干被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类全然由自身来控制序列化的行为,而仅实现Serializable接口的类能够採用默认的序列化方式 。 

凡是实现Serializable接口的类都有一个表示序列化版本号标识符的静态变量:private static final long serialVersionUID; 

类的serialVersionUID的默认值全然依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的serialVersionUID,也有可能同样。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明白的值。显式地定义serialVersionUID有两种用途: 

  1)在某些场合,希望类的不同版本号对序列化兼容,因此须要确保类的不同版本号具有同样的serialVersionUID;在某些场合,不希望类的不同版本号对序列化兼容,因此须要确保类的不同版本号具有不同的serialVersionUID。 

  2)当你序列化了一个类实例后,希望更改一个字段或加入�一个字段,不设置serialVersionUID,所做的不论什么更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。假设你加入�了serialVersionUID,在反序列旧有实例时,新加入�或更改的字段值将设为初始化值(对象为null,基本类型为对应的初始默认值),字段被删除将不设置。 

当系统不须要序列化类时,能够去掉这些警告,做例如以下设置:Window–>Preferences–>Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会又一次编译程序,那些警告信息也就消失了。 

struts架构下的站点常常出现javax.servlet.ServletException: BeanUtils.populate 错误,可是本地执行又一切正常,唯一认为可能产生问题的就是server上跑了好几个站点,都是一样的架构的,怀疑是不是web容器把几个项目之间的java类给共用了,考虑到非常多类都定义了serialVersionUID字段,然后尝试删除了某个类的serialVersionUID,结果关于该类的操作就恢复正常了。网上简单查阅了一下资料,感觉是tomcat把全部类串行化时候,因为我们的几个项目非常多java类都是复制粘贴的,所以导致了非常多类的serialVersionUID都是同一个值,所以tomcat会把不同项目的同样类名的类当作同一个类去处理,导致了这个奇怪的错误。 

解决方式: 
每一个项目同名的类serialVersionUID改为不一样,不能直接的复制粘贴过来。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118270.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月8日 下午4:00
下一篇 2021年12月8日 下午5:00


相关推荐

  • 【报错解决办法】ModuleNotFoundError: No module named ‘numba‘[通俗易懂]

    【报错解决办法】ModuleNotFoundError: No module named ‘numba‘[通俗易懂]numba是一款可以将python函数编译为机器代码的JIT编译器,经过numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。python之所以慢,是因为它是靠CPython编译的,numba的作用是给python换一种编译器。numba可以基于llvm动态生成优化代码,提高python的执行效率,只需要给python代码加上修饰器就好了。如果遇到ImportError:Nomodulenamednumba这样的问题,安装nu

    2025年8月14日
    4
  • 台式机通过网线连接笔记本的wifi网络

    台式机通过网线连接笔记本的wifi网络由于在实验室的场地要求,不容易拉网线进行学习,也就开始研究利用网线连接笔记本来使台式机连接上网络。【台式机:Ubuntu18.04+笔记本:Windows10】首先,Ubuntu系统的网络设置不变【IPV4,IPV6都是自动的】其次开始设置Windows10的网络(设置不好容易导致笔记本也上不了网哦)1.右击我们的图标,进入网络和Internet设置。2.进入网络和共享中心3.点击笔记本的WLAN网络(这个时候默认你已经插上了网线,而且进入的这个过程可以通过控制面板进入)4.这个时候

    2022年6月26日
    41
  • JWT原理讲解_达林顿管工作原理

    JWT原理讲解_达林顿管工作原理JWT(JSONWEBTOKEN)jwt有3部分组成:(head、Payload、signature)下面我们将分三步生成JWT的值。1.Head头部:一般包含两部分{“typ”:”JWT”,//固定为jwt”alg”:”HS256″//加密算法}第一部分的值:将Head进行Base64加密就是第一部分的值。2.Payload荷载:包含公共部分与自定义部分{ //公共部分,非强制可以省略。 “iss”:”servic

    2022年10月17日
    6
  • 硬盘数据恢复的方法_固态硬盘覆盖数据恢复吗

    硬盘数据恢复的方法_固态硬盘覆盖数据恢复吗想必许多朋友在硬盘数据遭到损坏时,第一反应就是拿到外面的电脑店去找专业的人士帮忙修复,这虽然也是一个可行的方法,但同时小编也觉得大可不必浪费这些时间专门跑到外面,且有可能要付出高昂的修复费用。那么,当硬盘损坏时,我们应如何第一时间恢复数据呢?答案就是用专业的数据恢复软件扫描恢复。所以在这里教大家如何用数据恢复软件来找回硬盘数据,不限制时间和地点,随时随地就能修复。操作也很简单,让我们来看看详细的步骤。1.在超级兔子官网下载软件后打开至主界面,在场景模式下选择U盘/内存卡恢复。2.点.

    2026年2月5日
    4
  • pyquery安装

    pyquery安装pyquery是一个类似jquery的工具,不过它是在服务端进行处理的,不像jquery是在浏览器中进行处理。如果我们要进行网络爬虫,爬取有用的信息,那么它是我至今见到的不二选择。我们当然可以自己爬取网页,然后可以通过正则表达式,选取有用的信息,但这其实要求挺高的。我以前也做过爬虫工具,专门抓取招聘网站的招聘信息,但我发先我以前做的实在是复杂。而我们程序员很重要的一点是,不要重复的发明轮子,我们只

    2022年6月6日
    105
  • isalpha函数你会么

    isalpha函数你会么函数 isalpha 原型 intisalpha intch 用法 头文件加入 include lt cctype gt 旧版本的编译器使用 lt ctype h gt 功能 判断字符 ch 是否为英文字母 当 ch 为英文字母 a z 或 A Z 时 在标准 c 中相当于使用 isupper ch islower ch 做测试 返回非零值 否则返回零

    2026年2月11日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号