serialVersionUID作用

java类中serialVersionUID的作用及其使用 主要介绍了java类中serialVersionUID的作用及其使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 立即下载
 

serialVersionUID作用

分类: Java 基础 网络应用   6917人阅读  评论(1)  收藏  举报

原文出处:未知


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 错误,但是本地运行又一切正常,唯一觉得可能产生问题的就是服务器上跑了好几个网站,都是一样的架构的,怀疑是不是web容器把几个项目之间的java类给共用了,考虑到很多类都定义了serialVersionUID字段,然后尝试删除了某个类的serialVersionUID,结果关于该类的操作就恢复正常了。网上简单查阅了一下资料,感觉是tomcat把所有类串行化时候,由于我们的几个项目很多java类都是复制粘贴的,所以导致了很多类的serialVersionUID都是同一个值,所以tomcat会把不同项目的相同类名的类当作同一个类去处理,导致了这个奇怪的错误。 

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


帝企鹅优化器(EPO)详解:从基础原理到代码实战 帝企鹅优化器(EPO)是受帝企鹅群体在极寒环境中抱团取暖行为启发,于2018年提出的一种群体智能优化算法。其核心机制是模拟帝企鹅种群通过动态调整位置来维持体温的过程,主要包括确定集群边界、计算温度分布、衡量个体间距离以及更新位置四个步骤,从而在求解复杂优化问题时有效平衡全局探索与局部开发。该算法具有参数少、结构清晰、易于实现等优点,在工程优化、图像处理、机器学习特征选择以及冷链物流车辆路径规划等领域展现出良好的应用潜力。 阅读详情

相关推荐

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 614

【Java 基础篇】serialVersionUID 详解

是 Java 序列化机制中的一个字段,用于标识类的版本。当一个类实现了接口(表示该类可以被序列化),编译器会自动生成一个字段,用于表示类的版本号。是一个长整型数值,通常是一个正整数,可以手动指定,也可以由编译器自动生成。该字段的主要作用是用于在反序列化时检查类的版本是否与序列化时的版本一致,以确保反序列化的对象与序列化时的对象是兼容的。当使用进行版本控制时,通常需要考虑以下情况:当类的版本发生变化时,如何确保反序列化仍然能够成功。以下是一个示例,演示了如何使用处理不同版本类的序列化和反序列化。

繁依Fanyi的博客 1万+

YooAsset 2.2.12四层加密架构:跨平台资源安全实战指南

AssetBundle加密是Unity热更新安全的核心环节,其本质是通过算法、密钥管理与生命周期协同实现资源全链路防护。传统方案常陷于‘打包后加密’的误区,导致内存开销大、跨平台兼容差、逆向防护弱。YooAsset 2.2.12提出打包层、传输层、加载层、运行层四层防护架构,将加密前置到资源序列化前,并依托BundleHeader实现动态算法协商与密钥分发,显著提升iOS/Android/WebGL三端一致性。该方案兼顾AES-128等通用算法与SM4等国密支持,同时通过IMemoryDecryptor实现

weixin_32428571的博客 415

Java序列化之serialVersionUID

Java序列化之serialVersionUID 今天讲一讲Java对象中的serialVersionUID,先从序列化讲起。 什么是序列化 序列化,简单的说,就是将一个对象转化(编码)成可以传输的输出流(字节流)。而反序列化就是序列化的逆过程,将输入流转化(构建)成一个对象。 为什么要序列化 字节流可以用于网络传输和存储在磁盘,而对象需要转化成字节流才能在网络中传输和在磁盘上存储。 网络传输就好比打电话,声音是无法直接从电话的一端传到另一端,因此需要将声音转成电信号进行传播。 另一方面,Java对象是保存

weixin_37901561的博客 4030

1.triton镜像使用

1)拉取镜像2)启动容器指定模型仓库时可以执行server下的./fetch_model.sh,见2.2部分GPU版本的启动CPU版本的启动区别只在于--gpus=1这个参数注意:docker19.03之前的版本使用gpu要指定显卡硬件名,docker19.03之后的需要安装nvidia-container-toolkit或nvidia-container-runtime安装之后要重启docker查看gpus参数是否安装成功重新执行我遇到了如下错误先使用非GPU版本的。

天启的博客 2077

C#与西门子PLC通讯——新手快速入门

本文基于C# .Net Core和西门子博图TIA Portal V17搭建。由于手边没有西门子PLC实物,所以采用S7-PLCSIM Advanced V4.0作为模拟PLC,以实现0成本完成通讯测试实例。这篇入门笔记解决了新手第一次上手实践时遇到的坑,并且有意忽略了实际项目中会遇到的逻辑交互和更多的数据格式问题。

吾家有猫名探花的博客 2万+

Java serialVersionUID

serialVersionUID

weixin_59661960的博客 1402

RISC-V— 架构基础知识学习

蜂鸟 E200 系列是一个开源的RISC-V 处理器。蜂鸟 E200 系列由中国大陆研发团队开发,用户能够轻松与开发人员取得交流和支持。RI蜂鸟 E200 处理器研发团队拥有在国际一流公司多年开发处理器的经验,使用稳健的Verilog 2001 语法编写的可综合 RTL 代码,以工业级标准进行开发。蜂鸟 E200 的代码为人工编写,添加丰富的注释且可读性强,非常易于理解。

deilt 1万+

Java中的`serialVersionUID`:深入理解与应用

假设我们有一个简单的Person类,我们希望显式定义。// 显式定义serialVersionUID@Override'}';代码解释我们显式定义了为1L,确保类的版本一致。在Java序列化中扮演着重要的角色,它确保了序列化后的对象在不同版本之间能够正确地反序列化。通过显式定义,开发者可以更好地控制类的版本兼容性,防止意外的反序列化错误。掌握的使用,不仅能够提升你的代码质量,还能让你在处理对象序列化问题时更加得心应手。希望本文能帮助你在实际项目中更好地应用,提升你的技术水平。

xycxycooo的博客 3075

易盾滑块的js逆向分析

基于易盾的滑块验证码进行逆向分析,最种实现全系列的验证码逆向,包括滑块、点选、推理拼图等多种类型。

shanf7921的博客 3万+

触摸芯片RM1015B基本使用方法

RM1015B触摸芯片使用指南:该芯片采用4通道设计(实际使用3通道),通过I2C接口通信(设备地址0x2B)。硬件设计需注意中断/复位引脚复用,需上拉处理。软件配置包括初始化、中断处理和定时器扫描,通过设置各通道阈值(0-300W)调节灵敏度,值越小越灵敏。调试时可调用rm1015B_debug_func()输出波形数据。典型应用场景包括接近检测和手势识别,中断触发后需在8ms内响应。特别注意不同通道的寄存器映射关系及校准流程,确保检测准确性。

云淡风轻 176

serialVersionUID的作用是什么

【强制】序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果 完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。 说明:注意 serialVersionUID 不一致会抛出序列化运行时异常。 当执行序列化时,我们写对象到磁盘中,会根据当前这个类的结构生成一个版本号ID。 当反序列化时,程序会比较磁盘中的序列化版本号ID跟当前的类结构生成的版本号ID是否一致,如果一致则反序列化成功,否则,反序列化失败。 加上版本号,有助于当我们的类.

星的奏鸣曲 4524

RK3566 Android11默认客户Launcher修改

【代码】RK3566 Android11默认客户Launcher修改。

Android系统开发笔记 1723

Serializable接口serialVersionUID作用

Serializable是Java提供的序列化接口,是一个空接口,为对象提供标准的序列化与反序列化操作。使用Serializable实现序列化过程相当简单,只需要在类声明的时候指定一个标识,便可以自动的实现默认的序列化过程。 private static final long serialVersionUID = 1L; 上面已经说明让对象实现序列化,只需要让当前类实...

ying3072的博客 2373

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

serialVersionUID的作用

简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidClassException) serialVersionUID有两种显示的生成方式: 一个是默认的1L,比如:private static final long s

pshdhx的博客 5915

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

serialVersionUID 实际的作用

serialVersionUID 实际作用 JAVA 中对序列化的支持 都是需要实现 Serializable 接口,然后需要声明一个serialVersionUID (也可以不用申明). serialVersionUID 的作用是什么呢? JAVA序列化的机制是通过判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersion...

java_magicsun的专栏 2564

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java类中serialVersionUID的作用

java类中serialVersionUID的作用 IDEA如何自动生成 serialVersionUID 的设置

ZPHTTT的博客 375

serialVersionUID作用介绍

英文翻译的意思是序列化版本号。凡是实现Serializable接口的类都会有一个表示序列化版本标识符的静态变量。

kghkgh123的博客 616

serialversionuid的作用

当我们在使用java编程的时候,肯定会使用到serialversionuid,但很多情况下并不知道serialversionuid的作用是什么,其实它就是一种语言序列化的机制。 serialversionuid的作用:答:serialversionuid的作用是验证版本一致性。如果serialversionuid一致,说明他们的版本是一样的。反之,就说明版本不同,就无法运行或使用相关功能。 1、serialversionuid是java中的一种序列化机制。2、当我们进行序列化操作时,会把当前的版本写入到文

i_am_xiaobai的博客 1万+

serialVersionUID 有什么作用?该如何使用?

当一个对象实现 Serializable 接口时,多数 ide 会提示声明一个静态常量 serialVersionUID(版本标识),那 serialVersionUID 到底有什么作用呢?应该如何使用 serialVersionUID ? 回答 serialVersionUID 是实现 Serializable 接口而来的,而 Serializable 则是应用于Java 对象序列化/反序列...

weixin_30352645的博客 1570

SerialVersionUID作用

运行报错: local class incompatible: stream classdesc serialVersionUID = 8610945373491150863, local class serialVersionUID = -5675075805772748087 SerialVersionUID作用:序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 在实现了Serializable接口的class中,需要声明一个long serialVersionUID,用来

weixin_41973367的博客 1026

Java serialVersionUID 有什么作用?

Java serialVersionUID 有什么作用?

qq_40091033的博客 253

Java中serialVersionUID的作用

Java中serialVersionUID的作用

Z 专栏 4332
上一篇: weblogic的集群与配置
下一篇: Java中的SerialVersionUID
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值