关于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就好了

TPAMI 2025新作LRFormer复现笔记:我的Windows 11 + RTX 4090配置全流程 本文详细记录了在Windows 11系统下使用RTX 4090显卡复现TPAMI 2025顶会论文LRTransformer的完整流程,包括硬件配置、系统优化、Python环境搭建及模型训练中的常见问题解决方案。特别针对Windows平台特有的路径管理、CUDA版本冲突和显存优化等关键技术细节提供了实用指南,帮助开发者高效完成环境搭建和模型训练。 阅读详情

相关推荐

【深度避坑】Word 提示“内存或磁盘空间不足,保存失败”的真正原因与终极解决方案

这是 Word 2003 时代的老功能⚠现代 Office 使用全新的保存 API(与 OneDrive 深度集成)老插件无法兼容现代保存机制会拦截 Word 的写入流程导致保存动作失败,Word 误以为磁盘坏了,于是报错不是磁盘坏了,是 Word 被插件绊倒了。Word 无法保存 = 加载项冲突(尤其是书法 / 稿纸向导)。永久禁用即可彻底恢复。如果在写毕业论文、要交文档,强烈建议马上检查一下你的加载项,避免后期出现大规模崩溃丢稿。

m0_59029415的博客 3067

Serializable兼容性问题及serialVersionUID的使用

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

huangxinyu_it的专栏 1611

QT编程系列1--QT学习前需知

本周学习了一些QT编程方面的知识,学写了几个程序,这里把记录下来。一方面对前面学习的知识做一个总结,便于以后复习、再学习和应用;另一方面也和大家做个交流,有不足的地方请各位看官多指点。   首先是做一些学习之前的交代:一,学习QT需要哪些基础;二,学习QT有哪些用途,QT较其他的开发工具有哪些特点;三,学习QT的思路。

霜月孤鸟&RTEMS&TinyOS 1115

Serializable接口serialVersionUID作用

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

ying3072的博客 2373

用Python玩转农业大数据:从Landsat遥感影像到作物产量预测实战教程

本文详细介绍了如何利用Python处理Landsat遥感影像数据,并结合土壤信息构建作物产量预测模型。从环境搭建、数据预处理到模型训练与可视化,提供了一套完整的农业大数据分析实战方案,帮助读者掌握遥感影像处理和机器学习在精准农业中的应用。

weixin_30832143的博客 397

OpenMMLab实战指南:从环境搭建到首个检测模型运行

本文是一份详细的OpenMMLab实战指南,重点介绍了如何从零开始搭建环境并运行首个目标检测模型。内容涵盖Miniconda环境配置、PyTorch与CUDA版本匹配、使用MIM工具安装MMCV和MMDetection的核心步骤,并通过RTMDet-tiny模型演示了完整的推理流程,帮助开发者高效入门这一计算机视觉开源算法体系。

weixin_28678151的博客 156

Serializable 之 SerialVersionUID

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

Han.启书的博客 952

密码学:一文读懂数字证书

消息摘要算法用于验证数据完整性服务,对称加密算法和非对称加密算法用于保证数据保密性服务,数字签名算法用于抗否认性服务。数字证书集合了多种密码学算法:自身带有公钥信息,可完成相应的加密/解密操作;同时,还带有数字签名,可鉴别消息来源;且自身带有消息摘要信息,可验证证书的完整性;由于证书本身含有用户身份信息,因而具有认证性。

Shujie 2910

Serializable接口 和 serialVersionUID 的关系

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

weixin_40821200的博客 187

eNSP常见故障处理

eNSP无法启动设备一直停在#井号的问题的解决方案?

lvshiliang123的博客 2万+

AI大模型助力现金流精准预测案例详解

因为它的“注意力机制”能像“人一样思考”——比如,当预测“下周现金流”时,模型会重点关注“最近7天的销售数据”“未来7天的天气”“竞品是否有促销”这些关键因素,而忽略“去年同期的无关数据”。AI大模型不是“取代”财务人员,而是“赋能”他们——把财务人员从“重复的Excel操作”中解放出来,专注于“战略决策”(比如如何优化资金结构、如何提升资金利用率)。比如,“促销力度”这个特征,不是简单的“折扣率”,而是“折扣率×促销天数×覆盖SKU数量”,这样能更准确反映促销对现金流的影响。这些问题的核心,其实是。

AIGC应用创新大全的博客 1258

Serializable里serialversionuid有点意思呀

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

洪晓鸿 1818

深入理解JVM虚拟机第一篇:Java跨平台和字节码以及多语言混合编程

本位描述了Java的跨平台和JVM的跨平台的作用,Java语言的字节码的概念多语言混合编程应用到JVM虚拟机以及Java发展的重大事件。

七叔的博客 1万+

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

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

WGH100817的博客 497

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Serializable与serialVersionUID的作用

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

qq_39217714的博客 875

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Serializable & serialVersionUID作用

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

weixin_43508555的博客 862

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

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

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、付费专栏及课程。

余额充值