记一次Serializable序列化和反序列化导致的线上报错

news2024/11/28 22:41:54

个人博客地址:https://blog.flycat.tech/archives/1709570797355

背景

某个需求上线后告警群里面收到了报错的消息,报错摘要如下:

Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: com.i61.draw.common.model.CommonTeacherInfo; local class incompatible: stream classdesc serialVersionUID = -5929137330017767311, local class serialVersionUID = -2020770249958646674 org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: com.xxx.xxx.common.model.CommonXxxxxxInfo; local class incompatible: stream classdesc serialVersionUID = -5929137330017767311, local class serialVersionUID = -2020770249958646674

排查

通过报错的栈信息,定位到问题代码第66行,可以看到是调getTeacherInfoList这个方法时,读取缓存反序列化失败了。

源码图片1

源码图片2

将报错信息复制到GPT,GPT的回答如下:


这个错误表明在反序列化过程中发生了问题,具体原因是由于 CommonXxxxxxInfo类的版本不一致导致的。在Java中,当一个类被序列化时,会生成一个包含版本信息的serialVersionUID。如果在反序列化时,类的版本信息不匹配,就会抛出 InvalidClassException

在你的具体情况中,错误信息中提到了两个不同的serialVersionUID值:

  • stream classdesc serialVersionUID = -5929137330017767311
  • local class serialVersionUID = -2020770249958646674

这表示你的代码中的 CommonXxxxxxInfo类在两个地方的版本不一致。可能的原因和解决方法包括:

  1. 类的版本变更: 可能是 CommonXxxxxxInfo类在序列化和反序列化之间发生了更改,可能是添加、删除或修改了字段。确保在序列化和反序列化的代码之间,CommonXxxxxxInfo类的版本是一致的。

  2. 显式指定serialVersionUID: 你可以在 CommonXxxxxxInfo类中显式指定serialVersionUID,以确保它在类发生变更时仍然保持一致。你可以在类中添加如下代码:

    javaCopy code

    private static final long serialVersionUID = -5929137330017767311L; // 使用实际的值替换

    在类发生变更时,手动更新这个值。

  3. 检查依赖版本: 如果 CommonXxxxxxInfo类是从外部库引入的,确保你的应用程序和库中使用的类版本一致。可能你的应用程序使用了一个不同版本的 CommonXxxxxxInfo类。

通过解决这些问题,你应该能够解决反序列化问题。在做任何更改之前,请确保备份你的代码以防意外。


其中有提到,由于没有指定serialVersionUID,当添加、删除或修改了字段,其默认的serialVersionUID会变更,查看CommonXxxxxxInfo类的git提交记录,果然添加了字段。

CleanShot 2024-03-05 at 00.32.39.png

解决

  1. 手动生成serialVersionUID值

总结

以前看到说继承了Serializable最好指定serialVersionUID,但在实际使用中,发现似乎不指定也没有问题,所以即使继承了这个接口也很少会再手动指定UID,所以以后遇到需要序列化(尤其是使用jdk序列化器)的地方,都应该:

  1. 需要序列化的地方(尤其是使用jdk序列化起)都要继承Serializable接口
  2. 手动生成serialVersionUID值
  3. 如果没有指定UID,当类结构发生变化(增减改字段)时,默认的UID会变化,导致序列化/反序列化失败

小提示:生成serialVersionUID值时可以使用IDEA插件GenerateSerialVersionUID

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1599165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P9241 [蓝桥杯 2023 省 B] 飞机降落

原题链接:[蓝桥杯 2023 省 B] 飞机降落 - 洛谷 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dfs全排列的变形题。 因为最后问飞机是否降落,并且一架飞机降落完毕时另一架飞机才能降落。所以我们设置dfs的两个变量cnt为安全…

【随笔】Git 高级篇 -- 管理多分支 git rebase(二十二)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念:FSM(有限状态机),模式之间转换 状态机,也叫有限状态机&#xff08…

TCE测试管理平台-社区版(免费),手机端小程序如何使用?

TCE测试管理平台社区版(免费)是泽众云测试平台SAAS服务产品之一,提供给个人和企业免费使用,无需安装,注册即可使用。 TestCenter Enterprise(简称TCE)是由泽众软件开发的一款面向测试流程的测试…

深入K8S实战

K8S: 深入K8S实战进阶篇 1、搭建 Kubernetes 集群 1.1、搭建方案 1.1.1、minikube minikube 是一个工具, 能让你在本地运行 Kubernetes。 minikube 在你的个人计算机(包括 Windows、macOS 和 Linux PC)上运行一个一体化(all-i…

【经典算法】LeetCode 136:只出现一次的数字(Java/C/Python3实现含注释说明,Easy)

个人主页: 进朱者赤 阿里非典型程序员一枚 ,记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名) 目录 题目描述思路及实现方式一:使用异或运算(推荐)思…

【LatentDiffusion 代码详解(1)】LatentDiffusion 的 yaml 解读

YAML 文件提供了一种清晰、简洁且易于理解的方式来描述配置信息,特别适用于机器学习模型的超参数调优和实验管理。 以 Latent Diffusion 官方代码仓库中的 https://github.com/CompVis/latent-diffusion/blob/main/configs/autoencoder/autoencoder_kl_32x32x4.yam…

MySQL表结构的操作

文章目录 1. 创建表2. 查看表3. 修改表4. 删除表 1. 创建表 create table table_name (field1 datatype,field2 datatype,field3 datatype )character set 字符集 collate 校验集 engine 存储引擎;field:列名datatype:列的类型character set&#xff1a…

数字乡村创新实践探索农业现代化与乡村振兴新路径:科技赋能农村全面振兴与农民福祉新纪元

目录 引言 一、数字乡村与农业现代化新路径 1、智慧农业引领农业现代化 2、农业产业链的数字化转型 二、数字乡村与乡村振兴新路径 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民福祉新纪元 1、提升农业生产效益与农民收入 2、促进…

2024蓝桥杯——宝石问题

先展示题目 声明 以下代码仅是我的个人看法,在自己考试过程中的优化版,本人考试就踩了很多坑,我会—一列举出来。代码可能很多,但是总体时间复杂度不高只有0(N) 函数里面的动态数组我没有写开辟判断和free,这里我忽略…

企业网站建设需要了解什么

在现代商业环境中,企业网站已经成为企业宣传、推广和销售的重要工具。企业网站的建设需要考虑多个因素,包括以下几个方面: 首先,了解企业的目标和定位。企业网站的建设应该围绕企业的目标和定位展开,以达到企业在市场中…

基于python的景点舆情分析,爬虫获取景点数据,评论数据,情感分析和可视化展示

概述 毕业设计项目中,构建一个基于Python的系统,用于抓取携程网上的江西省景点信息及对应评论数据,并进行深入的舆情分析。 数据获取: 使用Python的requests库模拟浏览器发送HTTP请求至指定URL(https://m.ctrip.com/r…

HW机试1

1.字符串翻转函数 string s;reverse(s.begin(),s.end()); 2.不区分大小写统计字符出现的个数 需要判断是大小写字母。根据ASCII码值&#xff0c;大写字母32小写字母 void func(string s,char ch) {int lens.length(),cnt0;if(ch>64){for(int i0;i<len;i){if(s[i]32ch…

用户相关的配置文件

1.新建用户的配置文件从哪里来的&#xff1f; 在Linux操作系统中都有一个默认行为&#xff0c;当在Linux操作系统中新建用户时&#xff0c;都会在/home/用户名 也就是新建用户的家目录中配置三个隐藏文件 分别是.bash-logout .bash-profile .bashrc 如上图所示&#xff…

解决WPS右键菜单冗余选项,去除WPS右键菜单选项

问题描述 安装WPS后&#xff0c;右键菜单会多出许多无用的选项&#xff0c;如何去除&#xff1f; 解决方法 按下WindowsS打开搜索栏&#xff0c;搜索配置工具打开 勾选所有的关闭和隐藏选项

通过Maven导入本地jar包

1.创建lib文件夹&#xff0c;把jar包放到文件夹里面 2.在pom里导入依赖 导入完成

AI数字人对话之RealChar框架源码解读

零.功能介绍 与虚拟角色(非形象)进行文本或语音会话 体验地址:RealChar. 代码库:GitHub - Shaunwei/RealChar: 🎙️🤖Create, Customize and Talk to your AI Character/Companion in Realtime (All in One Codebase!). Have a natural seamless conversation with AI…

2024年nodejs调用小红书最新关注(粉丝)follow接口,api接口分析2004-04-16

一、打开chrome按f12&#xff0c;点击右上角的“关注”按钮&#xff0c;抓包位置如下&#xff1a; (图1 follow接口) 二、follow接口分析 1、请求地址 https://edith.xiaohongshu.com/api/sns/web/v1/user/follow 2、请求方法: POST 3、请求头&#xff1a; :authority: edith…

【绘图案例-带圆环的图片-图片 Objective-C语言】

一、接下来,我们接着来说,带圆环的图片,图片, 1.我们还差这个,图片,啊, 图片还没有画上去啊,圆环已经画完了, 接下来呢,我们应该尝试着去画图片, // 12.画图片 image drawAtPoint:(CGPoint) 如果我直接这么着去画的话, 那么,实际上,就会把那个方形的东西,…