使用Redis做缓存,给实体类添加新字段后报序列化异常(已解决)

Java序列化与反序列化:从原理到实战,规避性能与安全陷阱 序列化是将对象状态转换为可存储或传输格式的核心技术,其本质是实现对象状态的持久化与网络传输。其工作原理涉及对象图的遍历、元数据描述及递归处理,是分布式系统、缓存和数据交换的底层支撑。在技术价值上,高效的序列化能显著提升系统性能与可扩展性,但不当使用会引发严重的安全漏洞与兼容性问题。在实际应用场景中,无论是微服务通信、缓存存储还是配置文件读写,都离不开对序列化机制的深入理解。本文聚焦Java序列化,通过分析线上故障案例,深入探讨了transient字段、serialVersionUID等关键机制,并对比了JS 阅读详情
叙述

今天在写项目时遇到了一个问题,我有一个类因为需求需要添加一个新的字段信息,当我在该l类上添加这个字段后,测试接口获取这个类对象的信息时,给我报了一个序列化错误的Excption,具体错误信息如下
在这里插入图片描述

原因

通过错误日志,我们可以很清楚的了解到造成异常的原因主要就是serialVersionUID不对应导致的。
这个问题其实主要还是我们平时不规范的编码方式造成的,我们知道serialVersionUID的作用是,保证对象在序列化时版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
如果我们的类实现了Serializable接口,我们就需要给该类指定一个serialVersionUID,保证对象在序列化和反序列化都能保证一致。通常的做法是

private static final long serialVersionUID = 1L;

当然如果你没有在该类中显示的设置serialVersionUID的话
JVM会根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段作为该类的serialVersionUID。
而我目前就是没有显示的设置serialVersionUID, 而又因为我使用了redis做数据缓存,并且在还没有更改该类之前已经做了一次请求,并完成了数据缓存。当我在该类中新增了一个字段后,随着成员属性的变化,serialVersionUID也跟着改变了,而这时候redis中缓存的数据对象在序列化时所使用的serialVersionUID是上一个版本的,所以redis中的数据对象在反序列化时发现serialVersionUID不匹配而导致失败,抛出java. io. InvalidClassException异常。

解决办法

解决的办法有两种

  1. 如果不打算兼容redis中的老数据,那可以在类中指定 serialVersionUID = 1L,然后删除掉redis中的老数据。
  2. 如果打算兼容老数据,可以在类中指定serialVersionUID的值为redis中老数据对象的serialVersionUID的值,这个值会在错误日志中得出。
总结

因为我们目前所写的项目都是单体系统,项目在每次重启之后都会重新实例化对象,而很少会用到对象的序列化和反序列化的机制,因此我们即时不指定serialVersionUID也不会报java. io. InvalidClassException异常。而因为这样我们往往很容易或略掉这个serialVersionUID的指定,这不是一个好的编码习惯,当我们需要用到对象的序列化和反序列化机制时,如果我们没有指定serialVersionUID, 而在对象被序列化之后,我们改了类信息,那么类的默认serialVersionUID也跟着改变,当我们把之前序列化的对象进行反序列化时就会因为serialVersionUID不匹配而报错。所以建议大家在编码过程中如果某个类实现了Serializable接口,就给指定一个serialVersionUID。

C# ISerializable 深度解析:从原理到版本兼容的序列化实践 在C#与.NET开发中,对象序列化是数据持久化与跨进程通信的基础技术。默认的反射式序列化虽简单易用,但在长期维护中面临字段变更、敏感数据泄露、内部结构重构等挑战。ISerializable接口应运而生,它将数据读写的主导权交还给开发者,通过GetObjectData与专用反序列化构造函数,构建显式的数据契约,实现跨版本兼容与自定义控制。该接口在BinaryFormatter历史数据迁移、复杂对象图重建、通信协议定制等场景中尤为关键。理解其原理,有助于高级开发者处理版本演进与数据安全难题,也是构建稳定、可维护 阅读详情

相关推荐

Sw模块JSON交互实战:从序列化到配置管理的完整指南

JSON作为一种轻量级、跨语言的数据交换格式,其核心原理在于通过键值对集合和有序列表两种基本结构,构建出可嵌套的树形数据结构。这一特性使其在序列化与反序列化过程中,能够高效地在内存对象与文本格式间转换,奠定了现代软件模块间数据通信的技术基础。其技术价值在于提供了标准化的数据表示方法,极大简化了异构系统间的集成复杂度。在工程实践中,JSON广泛应用于API通信、配置文件管理、消息队列及数据持久化等场景。本文聚焦于Sw模块与JSON的深度交互,通过解析Python、Java等主流语言中的高性能处理库(如orjs

weixin_33970449的博客 545

可序列化对象储存在redis中,在其添加了一个属性后导致序列化失败

在代码中有一个实体类对象,有abc三个属性,因为需要使用redis存储,就让其实现了序列化接口,如图上描述。

RitaChenxi的博客 913

汇川机器人与PLC通信-ModbusTCP超详细案例

通过汇川机器人与PLC的ModbusTCP通信项目案例,我们可以了解通讯配置的过程,地址映射的方式,对接信号的转换,运行时序的逻辑等注意事项,帮助我们快速应用到项目中。

weixin_44166380的博客 1万+

因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题...

背景描述 因为业务需求的需要,我们需要在原来项目中的一个DTO类中新增两个字段(我们项目使用的是dubbo架构,这个DTO在A项目/服务的domain包中,会被其他的项目如B、C、D引用到)。但是这个DTO对象已经在Redis缓存中存在了,如果我们直接向类中增加字段而不做任何处理的话,那么查询操作查出来的缓存对象就会报反序列化失败的错误,从而影响正常的业务流程,那么来看一下我的解决方案吧。 升级...

翎野君的博客 695

使用MID360在室内快速定位

在预构建的点云地图中实现实时3D全球定位。通过融合FAST-LIO的低频全局定位(约0.5~0.2Hz)和高频里程计,整个系统的计算效率很高。消除里程计的累计误差初始定位可以通过RVIZ的粗略手动估计或来自另一个传感器/算法的姿势来提供。

CTwinkle的博客 1161

利用Arcgis发布wmts服务

使用发布 GIS 服务连接连接到 ArcGIS Server 站点后,可以将各种 GIS 资源(如地图文档、数据库以及服务定义)发布到服务器上。此外,还可以添加、删除、启动和停止服务。使用管理 GIS 服务器连接到 ArcGIS Server 站点后,可以编辑各种服务器属性,例如配置存储位置、集群配置、参与到该站点中的计算机列表以及管理站点的数据存储。通过使用 GIS 服务连接建立连接后,可以查看并使用发布到该站点的服务。但不能编辑服务器或服务属性、发布服务,也不能添加、删除、启动、停止或暂停服务。

ghgfsasxda的博客 2392

20180704-如果你已将某个类的实例序列化到磁盘,这时候再往这个类添加新的属性,那么反序列化该对象时会发生什么?

只要在类中定义了SerializableUID,在类中新增属性不会导致序列化失败,新增的字段在反序列化时失败,新增的字段将被初始化为初始值,如String将被初始化为null,int将被初始化0。...

得一 1778

Ubuntu22.04+Docker一键部署Autoware Universe避坑指南(附鱼香ROS配置)

本文详细介绍了在Ubuntu22.04系统中使用Docker一键部署Autoware Universe的完整流程,包括鱼香ROS工具链配置、Docker环境优化及VSCode开发环境集成。通过实战指南帮助开发者快速搭建自动驾驶开发环境,解决常见部署问题,提升开发效率。

weixin_29254673的博客 413

RedisTemplate序列化后数据字段增加,代码无常,大肠包小肠

RedisTemplate应该很多公司都有在用,这次发现一个小问题,对象序列化后,缓存到redis的json数据,出现了一个多余的字段。给我一顿找啊。 检查了一下缓存数据对象信息,确认无误。(为什么需要检查这个呢,因为之前吃过亏,使用Lambda表达式的双大括号创建的对象{{}},class信息会指向当前类,而不是对应的Bean,进而反序列化失败)再找到对应的类,向着父类一层一层的找,确实没有这个update字段。(是的,序列化对象多出来了一个update字段,布尔类型,而且值为false)虽然,没有找到

Rosen's 1292

【虚幻引擎】UE4初学者系列教程基础篇-全中文新手入门教程(UE5系列继续更新)

菜单栏菜单栏当中有文件、编辑、窗口帮助。文件当中可以进行一个关卡的新建、关卡的打开、关卡的保存还有就是打包项目,(项目大于关卡,项目里面可能有几百个关卡),这是比较常用的几个,这里可以看到打包当中有安卓端HTML5端,IOS端linux,还有就是TVOS(苹果电视)、windows的一些端口的一些设置。还可以打开最近打开的项目。关卡编辑器:工具栏3.3 “模式”面板保存所有:ctrl+shift+s(有的软件截屏也是这个按键需要注意)3.4 “内容浏览器”面板缩放:ctr+鼠标滚轮3.5.视口面板。

qq_45206556的博客 2万+

2026年GESP3月认证C++五级真题解析

因为要合并成升序数组,所以当A[i]小于等于B[j]时,取A[i],否则取B[j]。当a[i]>a[j]时,左边数组中从i到m的所有元素都大于a[j],因此逆序对数量增加m-i+1。给定一个包含n个互不相同的正整数的数组A与一个包含m个互不相同的正整数的数组B,请你帮忙计算有多少个数在数组A与数组B中均出现。下面代码实现两个整数除法,其中被除数为一个“大整数”,用字符串表示,除数是一个小整数,用int表示,则横线处应该填写()。且a[i] > a[j],则a[i]和a[j]是一个逆序对。

lan_in的博客 116

理解 Java 序列化

一、什么是序列化 序列化是一种对象持久化的手段。类通过实现 java.io.Serializable 接口以启用其序列化功能。 **序列化:**把对象转换为字节序列的过程。 **反序列化:**把字节序列恢复为对象的过程 《阿里巴巴Java开发手册》中对于序列化有以下规定 : 【强制】序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如 果完全不兼容升级,避免...

RookieMZL 的博客 389

3D深度饼图的QT实现

首先,我们需要创建一个QT项目并创建一个窗口,用于显示我们的饼图。在QT Creator中,选择创建一个新的QT Widgets应用程序项目,并创建一个新的窗口类。在本文中,我将介绍如何使用QT实现一个3D深度饼图(Pie 3D)的可视化效果。在构造函数中,我们将创建一个饼图(QChartView)并设置饼图的数据。这是一个简单的示例,您可以根据需要自定义和扩展代码来创建更复杂的饼图。现在,我们已经完成了3D深度饼图的QT实现。您将看到一个具有相应数据的3D深度饼图显示在窗口中。3D深度饼图的QT实现。

CodeJolt的博客 277

redis反序列化异常

使用spring security扩展Userdetail 实现oauth2 时用redis做缓存实现序列化与反序列化时,遇到了下面的错误: 原因:往Userdetail的实现类中添加了字段使得程序启动正常,sevrlet转发时异常 猜测: user 类扩展了security的Userdetail,用了redis做缓存。新增字段后,序列化的内容可能key一样并且没过期就没刷新redis的内容,...

weixin_42327945的博客 3316

[QMT量化交易小白入门]-104、QMT平台运行深度学习模型,预测期货价格

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 479

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

一次SNAPSHOT依赖污染引发Redis共享缓存投毒的生产事故复盘

一次因本地 mvn deploy 误操作导致的 SNAPSHOT 依赖污染,引发共享用户缓存“投毒”事故。由于各微服务回写缓存时使用自身 fat jar 中的旧版 User 类,导致反序列化失败,缓存数据被污染。清缓存仅暂时缓解,一旦新版服务再次回填,问题复发。通过日志排查与排除法锁定“不报错但发版”的服务为真凶,最终确认根因:依赖版本管理缺陷与读穿回填机制的隐患叠加。教训深刻:不可靠的快照依赖、严格反序列化模式及吞异常不清理缓存,共同酿成生产事故。

liangsheng_g的专栏 222

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

序列化UID

会自动根据类的结构计算哈希,但是非常不稳定,稍微修改就会改变,所以必须显式声明。

qq_52325051的博客 506

IDEA的使用指南

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

怀旧版电脑GBC模拟器

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

序列化与反序列化深度解析:从Java、JSON到Redis的工程实践与安全漏洞

序列化与反序列化是数据在内存对象与字节流之间转换的核心机制,涉及数据格式、类型映射与对象图处理三层结构。其技术价值在于实现数据持久化、网络传输与跨语言通信,广泛应用于缓存、RPC、消息队列等场景。Java原生序列化因兼容性与安全风险逐渐被JSON、Protobuf等替代,而反序列化漏洞更成为远程代码执行的高危入口。理解序列化协议选型与安全编码习惯,是后端工程师规避线上故障与安全事件的基本功。

weixin_34389926的博客 349

Spring Data Redis 实战:如何优雅处理新旧版本数据兼容性问题(附完整配置代码)

本文针对Spring Data Redis应用在版本迭代中常见的数据兼容性问题,提供了优雅的解决方案。通过详细解析反序列化报错的根源,并给出完整的配置代码,指导开发者如何定制RedisTemplate,使其在反序列化时忽略未知字段,从而保障应用在滚动发布或回滚时能平滑处理新旧版本数据,实现弹性架构。

k8s6orchestrator的博客 616

Redis反序列化报错?可能是Jackson的严格模式在作怪(附解决方案)

本文深入分析了Redis反序列化报错UnrecognizedPropertyException的常见原因,指出其根源在于Jackson库默认的严格模式。文章提供了通过全局配置RedisTemplate,禁用FAIL_ON_UNKNOWN_PROPERTIES特性以解决字段不匹配问题的核心方案,并探讨了使用@JsonIgnoreProperties注解等进阶策略,帮助开发者实现服务版本迭代中的数据向后兼容。

efc123456的博客 435

Spring Boot + Redis实战:如何优雅处理新增字段导致的反序列化问题(附完整配置代码)

本文针对Spring Boot项目中因实体类新增字段导致Redis反序列化失败的问题,提供了优雅的解决方案。通过自定义RedisTemplate配置,关闭Jackson的严格未知属性检查,实现数据结构的向后兼容,确保不同版本服务实例在迭代过程中稳定运行。

http9protocoller的博客 175

序列化与反序列化:原理、选型、安全与生产实践

程序运行时的对象都存于内存,进程结束后数据即消失。为持久化或跨网络传输,需将对象转换为字节流——这就是序列化;逆向还原则为反序列化。从早期手写拼串到JSON、Java原生序列化、Protocol Buffers等方案,每种格式在可读性、性能与兼容性上各有取舍。在Redis缓存、消息队列、RPC调用等场景中,序列化方案选型直接影响系统稳定性,而反序列化漏洞(如fastjson的autoType问题、PHP的unserialize与phar触发)已成为安全重灾区。理解字节布局、版本容错、类白名单等机制,掌握生产

weixin_34007886的博客 310

实战指南:如何优雅处理Redis新旧版本数据兼容性问题

本文通过线上故障案例,深入剖析了Redis在应用版本迭代中因数据模型变更导致的反序列化兼容性问题。文章对比了Jackson与Fastjson的默认行为差异,并提供了详细的实战配置方案,指导开发者如何优雅配置Jackson的序列化器以忽略未知字段,确保新旧版本服务在滚动升级期间平稳运行。

grpc6streamer的博客 695

Java序列化机制详解与最佳实践

序列化是将对象转换为可存储或传输格式的基础技术,其核心原理是通过字节流表示对象状态。Java通过Serializable接口实现原生序列化,利用serialVersionUID进行版本控制。这项技术在分布式系统、持久化存储和跨进程通信中具有重要价值,特别是在微服务架构中,高效的序列化方案能显著提升系统性能。针对安全性和性能优化,开发者需要注意transient字段处理、自定义序列化逻辑以及替代方案选择。热门的序列化框架如Protocol Buffers和Kryo在特定场景下相比Java原生序列化能带来显著的

weixin_34377919的博客 356

Redis缓存格式升级实战:cleanupOldFormatResults渐进式清理方案

Redis将数据视为二进制,具体格式由业务代码定义。一旦接口升级或序列化方案变更,旧缓存就会成为新代码的陷阱,引发反序列化异常、脏读甚至缓存雪崩。解决这类问题的核心不是直接清库,而是建立一套安全、可控、可回滚的渐进式清理机制。SCAN游标遍历替代KEYS全量扫描,避免阻塞Redis;通过key内嵌版本号精准识别旧格式;配合分布式锁防止多实例重复清理,使用UNLINK异步删除降低大key阻塞风险。这套方法在接口重构、服务启动任务优化和缓存治理中都能落地,既能应急清理脏数据,也能沉淀为日常运维工具。掌握缓存版本

weixin_33585822的博客 276

Java序列化原理、安全漏洞与主流方案选型实战指南

序列化是将对象状态转换为可存储或传输格式的过程,其核心原理涉及对象图遍历、元数据管理和版本控制。在分布式系统和微服务架构中,序列化技术是实现数据持久化、网络通信和缓存同步的基石,直接影响着系统的性能、兼容性与安全性。Java原生序列化虽然基础,但存在性能低下和跨语言支持弱的问题,因此在实际工程中,JSON序列化方案如Jackson、Fastjson因其良好的可读性和跨语言能力成为Web应用主流,而Protocol Buffers等二进制协议则在追求极致性能的RPC场景中备受青睐。同时,反序列化过程可能引发严

weixin_34411563的博客 311
上一篇: Java线程池拒绝策略(JDK内置)
下一篇: rmi项目中,相互依赖的子工程项目中无法导入对方的类和接口
小码林marlin
博客等级 码龄9年 30粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值