关于Serializable的serialVersionUID

众所周知,当某class实现了Serializable接口后,由此class构建出的对象将具备序列化的能力,而Serializable这个接口中没有任何需要实现的方法,所以这个接口的作用仅仅是作为一个标记,告诉虚拟机,具有这个标记的对象,是可以被序列化的,而没有这个标记的则不要序列化。所以,虚拟机应该是可以将任何对象序列化的,只不过是它遵守了一个“道德“规范,仅序列化那些被允许可以序列化的。那为什么不是所有的对象都是可序列化的呢?我想也许是基于安全性的考量吧。

序列化的一般过程是:

  1. 在虚拟机A中,构造了class AClass的对象AObject
  2. 将AObject序列化写入到文件ObjectFile中
  3. 在虚拟机B中,读取文件ObjectFile
  4. 根据AClass和读取进来的byte[],构造虚拟机B中的AClass的对象BObject

这里面,不好理解的事情是在第四步中,如果虚拟机B仅有AObject的数据,并不足以构造出BObject,它必须还需要有AClass的信息。也就是说, 序列化,仅仅是把对象以二进制的形式写入到了文件之中,但是这些二进制该组织成什么样的一个东西,却并不能说明,所以还需要AClass的类型信息,这就 如同交给了你一大堆的机器零件,还需要你拥有一本组装说明书,你才能把这些零件组装成一架波音747。:)。也就是说,序列化的仅仅是Object,而没有同时把这个Object所依赖的所有class一并序列化过去。那为什么不这么做呢?也许和ClassLoader有关?又和安全性有关?

在实现了Serializable接口的class中,需要声明一个long serialVersionUID,用来标明当前class的版本号:

  • 如果在序列化写时的版本号和序列化读时的版本号,不一致,将会有异常:
    java.io.InvalidClassException:
    local class incompatible: stream classdesc serialVersionUID = …, local class serialVersionUID = …
  • 那如果在class中不声明这个属性呢?那结果可以就会变得比较诡异了:
    • 在序列化写的时候,虚拟机A会为它计算出一个serialVersionUID,计算的方法是依据class的信息,再具体我也不清楚了。
    • 在序列化读的时候,虚拟机B也会为class计算出一个serialVersionUID,然后做比较。
    • 那么如果两个虚拟机是不同类型的虚拟机,那么计算方法可能就不一样了,于是即使相同的class,serialVersionUID也可能会不同,不同的class的,理论上来说,也存在serialVersionUID相同的可能性,所以,serialVersionUID尽量由我们自己来指定,而不要由虚拟机来计算。
  • 那如果serialVersionUID一致,而class发生了变化呢?
    • 如果虚拟机A中的AClass有一个属性,而虚拟机B中的AClass,没有这个属性,那么这个属性将被忽略,而不会有异常。
    • 如果虚拟机A中的AClass没有的属性,而在虚拟机B中多出来的属性,那么这个属性将被赋予一个缺省值,而不会有异常。
    • 如果虚拟机A中的AClass有一个属性,在虚拟机B中的AClass也有这个属性,但这个属性的类型变了,比如说int变成了long,抑或其他的变化,将会有异常:
      java.io.InvalidClassException:
      incompatible types for field …

经过序列化而产生的异常都是 java.io.InvalidClassException,不会产生java.lang.ClassCastException,两者还是有比较大的区别的,从名字上就可以看得出来。

 

 

 

我自己遇到的问题是:local class incompatible: stream classdesc serialVersionUID = 4379444343007238900, local class serialVersionUID = -4347374884104808421
 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)

解决办法是去除所有Eclipse自动生成的serialVersionUID,当去除所有的serialVersionUID 后还出现以上问题,重启tomcat就好了

ZYNQ实战:如何用AXI-stream FIFO解决跨时钟域数据同步难题(附完整代码) 本文深入探讨了在ZYNQ项目中,如何利用AXI-Stream FIFO有效解决PS与PL之间的跨时钟域数据同步难题。文章详细分析了异步FIFO的架构设计、关键配置参数,并提供了PS端软件策略与PL端逻辑设计的完整代码示例,旨在帮助开发者构建稳定可靠的数据流通道,优化系统性能。 阅读详情

相关推荐

CSRT跟踪算法的使用

Fu Xianjun. All Rights Reserved. 文章目录 前言 一、CSRT跟踪算法是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、CSRT跟踪算法是什么? 在具有通道和空间可靠性的判别相关滤波器(DCF-CSR)中,我们使用空间可靠性图将滤波器支持调整为从帧中选择区.

sinat_53821602的博客 7905

Serializable兼容性问题及serialVersionUID的使用

兼容性问题 兼容性历来是复杂而麻烦的问题。 不要兼容性: 首先来看看如果我们的目的是不要兼容性,应该注意哪些。不要兼容性的场合很多,比如war3每当版本升级就不能够读取以前的replays。 兼容也就是版本控制,java通过一个名为UID(stream unique identifier)来控制,这个UID是隐式的,它通过类名,方法名等诸多因素经过计算而得,理论上是

huangxinyu_it的专栏 1611

卡尔曼滤波调参避坑指南:Q/R参数怎么设?实测5种传感器场景

本文针对卡尔曼滤波在工程实践中Q/R参数设置的难题,提供了一套实用的调参避坑指南。通过分析过程噪声方差Q与测量噪声方差R的物理意义与博弈关系,并结合温度传感器、陀螺仪、超声波测距等五种典型传感器场景的实测效果对比,总结出从噪声估算、离线仿真到收敛测试的系统性调参方法论,帮助工程师快速实现稳定有效的滤波效果。

weixin_29174141的博客 803

Serializable接口serialVersionUID作用

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

ying3072的博客 2373

Win10离线安装.net framework 3.5全攻略:镜像匹配与DISM命令实战(附错误0x8024402c解决方案)

本文详细解析了在Windows 10系统中离线安装.NET Framework 3.5的完整流程与核心难点。重点阐述了如何精准匹配系统版本与安装镜像,并提供了使用DISM命令进行离线安装的实战步骤。针对常见的错误代码0x8024402c,文章深入剖析了其根源,并给出了系统级的排查与解决方案,特别适合企业内网运维人员参考。

weixin_29299807的博客 661

Docker一键部署NextCloud+OnlyOffice:打造企业级私有云办公环境(含HTTPS配置)

本文详细介绍了如何使用Docker Compose一键部署NextCloud与OnlyOffice,构建安全、高效的企业级私有云办公平台。内容涵盖从架构设计、Docker编排配置、HTTPS证书自动化管理,到系统初始化、性能优化及高级功能扩展的全栈实战指南,帮助企业实现数据自主可控与高效的在线文档编辑协作。

Apple的专栏 1240

Serializable 之 SerialVersionUID

Serializable 之 SerialVersionUID 本文不讲基本概念问题,如有需要 请另行查阅其他资料 最近在开发过程中遇到了InvalidClassException,也是基础不牢的缘故,导致不能快速的发现本质问题,进行有效的处理。于是侥幸的处理完这个问题之后,就想着好好的深入研究一下(也不算很深入,只是阅读了一下源码)。 正文 在Java中,存在Serializable接口,对它的...

Han.启书的博客 952

空天大模型详解

空天大模型是指面向空天信息领域(如卫星遥感、导航、气象等)设计的多模态人工智能模型,能够处理海量遥感数据、多传感器信息及跨时空分析任务。多模态融合:整合可见光、雷达、热红外、多光谱等多源遥感数据,构建统一表征空间,例如“空天·灵眸”3.0版支持航空、卫星及无人机数据的自动化解译。轻量化与高效推理:针对星载计算场景,采用分层量化、跨模态蒸馏技术压缩模型参数(如JigonGPT从1.02B压缩至0.23B,性能仅牺牲5.2%)18,并通过热传导架构提升计算速度2.4倍。神经符号结合。

zxy98的专栏 1567

Serializable接口 和 serialVersionUID 的关系

结论建议实现了Serializable 手动生成 serialVersionUID一般认为实现了Serializable 接口,不手动生成serialVersionUID不会出问题。如果没有手动生成,序列化和反序列化的时候,通过类所有字段算一个serialVersionUID出来,但是据说不同jvm可能算的不一样。实现了S...

weixin_40821200的博客 187

how2heap 深入学习(1)

how2heap glibc 2.23学习

CoLin的pwn小屋 3179

YOLOV26详解 从原理到部署

计算机视觉领域最具影响力的目标检测框架迎来重大里程碑。2026年1月,Ultralytics 正式发布 YOLOv26——这不是一次简单的版本迭代,而是一场面向边缘计算时代的架构重构。本专栏基于 Ultralytics 官方技术白皮书、YOLO Vision 2025 大会首发内容及国际前沿研究成果,系统拆解 YOLOv26 从算法原理到工程落地的全栈技术体系。与常规教程不同,我们聚焦与,帮助你在端侧 AI 部署的实战中掌握核心竞争力。

u012133341的博客 2019

Serializable里serialversionuid有点意思呀

它是一个长整型的常量,用于标识一个特定版本的类,确保在不同的JVM实例之间,序列化和反序列化的过程中能够正确地识别和匹配类的版本。需要注意的是,即使类的属性发生变化,如果变化并不会影响序列化和反序列化操作,也就是说,变化后的类的结构与旧版本的类的结构兼容,那么可以不更新。的作用是确保序列化和反序列化的正确性,即使类的内部细节发生变化,也能够正确地识别和匹配类的版本,避免出现反序列化失败的情况。在一些特殊的情况下,比如一些内部使用的类或数据传输协议已经稳定的情况下,可以通过指定固定的。

洪晓鸿 1819

UG\NX二次开发 替换部件引用集UF_ASSEM_replace_refset

替换部件引用集UF_ASSEM_replace_refset,需要替换成“完整部件(Entire Part)”需要第三个参数传入空指针或者空字符串。

王牌飞行员_里海的博客 255

FIR与IIR滤波器本质区别及工程选型指南

数字滤波器是信号处理的核心基础,其中FIR(有限冲激响应)与IIR(无限冲激响应)代表两类根本不同的系统实现范式。其差异源于结构原理:FIR为非递归、无反馈的滑动加权平均,天然绝对稳定且可实现线性相位;IIR则依赖输出反馈构成递归系统,以极低阶数换取陡峭频率响应,但稳定性受极点位置严格约束。这一原理差异直接决定资源消耗、实时延迟、相位保真度与定点鲁棒性等关键技术指标。在医疗ECG波形重建、通信脉冲整形、音频参量均衡等需线性相位的场景中,FIR不可替代;而在超低功耗IoT陷波、实时语音降噪、电机电流环控制等强

WGH100817的博客 497

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Serializable与serialVersionUID的作用

总述 下面我通过三种场景来表现出Serializable与serialVersionUID的作用。 没有实现序列化接口Serializable的场景 实现了序列化接口Serializable,但没指定serialVersionUID值的场景 实现了序列化接口Serializable,并指定serialVersionUID值的场景 一、未实现序列化接口场景 实体类Student没有实现Serializable接口 1.实体类 import java.io.Serializable; /** * @au

qq_39217714的博客 875

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Serializable & serialVersionUID作用

序列化是一种对象持久化的手段,普遍应用在网络传输、RMI等场景中,类通过实现 java.io.Serializable 接口以启用其序列化功能。 但是,还有一个知识点并未展开介绍,那就是关于serialVersionUID ,这个字段到底有什么用? 一、Serializable 1.1 简介 Java类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。 1.2 作用 在分布式应用中,就得实现序列化

weixin_43508555的博客 862

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Serializable的serialVersionUID作用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34329187的博客 126

Serializable接口、序列化反序列化以及serialVersionUID解读

1. Serializable接口 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化)。serialization 不但可以在本机做,而且可以经由网络操作。它自动屏蔽了操作系统的差异,字节顺序等。比如,在 Windows 平台生成一个对象并序列化之,然后通过网络传到一台 Unix 机...

shijiujiu33的博客 968

IDEA 配置Serializable的快捷键快速生成serialVersionUID

一、引言 在Java的序列化机制中是通过判断类的serialVersionUID来验证版本的一致性的,JVM会将接到的Java对象字节流中的serialVersionUID和本地相应实体类的serialVersionUID进行对比,看下是否是一致的,如果是一致,则进行反序列化操作,如果不是一致的,则会出现InvalidCastException错误。因此,我们常常显示声明serialVersionUID以避免对象不一致问题,为了快速显示声明serialVersionUID,我们需要用到DE...

GyaoG的专栏 2万+

Java中序列化接口Serializable的serialVersionUID的作用

本文介绍Java中序列化接口Serializable的serialVersionUID的作用。

IT利刃出鞘的博客 3565

Serializable中的serialVersionUID到底有啥用

最近在研究跨进程通信的问题,于是又再一次研究了,我们熟悉而又陌生的Serializable接口。 那么好,做过Java开发的朋友肯定对这个接口不陌生吧,Java中就是通过这个接口,来实现了序列化和反序列化的,那么下面看看使用Serializable接口的小例子。 public class User implements Serializable{ private String n

裸奔的蜗牛 8592

Understand the Serializable and serialVersionUID

看了一篇简单介绍serialVersionUID的文章,在这里结合javaAPI文档和自己的理解说一下Serializable和serialVersionUID。 [size=medium][color=darkblue]一、Serializable[/color][/size] 在JavaAPI中已经将这个问题说的很明白了,下面只是简单...

世界上有10种人 121

实现了Serializable就一定需要写serialVersionUID

1.代码刚更新就有同事找我报错了 com.voc4cloud.voc.admin.api.dto.UserInfo; local class incompatible: stream classdesc serialVersionUID = -6423749437980912546, local class serialVersionUID = 8189966274600548814` 2.发现: 通过查看日志发现是序列化报错了 3.原因: 因为新增了一个字段 , 而这个类没有写serialVersio

Better Than You的博客 1937

探究 Serializable接口和serialversionUID 意义及用途

问题描述 我们在实体类中实现了Serializable这个接口,那么这个接口到底有什么用?另外还定义了个serialVersionUID变量,这个变量又有什么作用呢? 什么是Serializable接口 一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。 什么是序列化? 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象.

qq_37552636的博客 929
上一篇: <c:forEach>标签的详解
下一篇: 正确理解Traceback的含义
danwind
博客等级 码龄19年 6粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值