一、前言

今天在增加完新功能后, 部署的时候,突然就遇到了java.io.InvalidClassException的问题,这些都是我们平常不注意细节造成的后果。

具体异常如下

分析异常:Caused by:java. io. InvalidClassException: com. eastcom xxx.xxxxxx. bean. AlarmReq; local class incompatible: stream classdesc serialversionUID =1631280650588763177, local class seriaiversionuId = 6638111461888145730

二、分析原因

首先我们的系统架构,是因为要将对象通过

AlarmReq alarmReq= JSONObject.toJavaObject(json,AlarmReq.class);
redisQueue = redisTaskContainer.getRedisQueue();
redisQueue.pushFromHead(alarmReq);

上述方法会将对象序列化到redis内存中,然后又再通过 redisTemplate.getValueSerializer().deserialize() 方法将数据反序列化到bean对象,这样的话,如果改动了这个bean对象的话,即加了属性的话,就会导致serialVersionUID会变,而且当时我们的bean对象即上述的AlarmReq对象,当时是没有加serialVersionUID的。

由于序列化时该类的serialVersionUID是JVM根据类名及其属性的哈希值生成的。当类的属性有变动时,serialVersionUID也会相应变动,从而导致redis中的老数据反序列化为AlarmReq bean对象时,serialVersionUID匹配不上而失败,会报出java. io. InvalidClassException。

三、解决问题

知道原因了,我们就可以解决问题了

方法1:不考虑和老数据兼容的话,直接在你实现了Serializable的这个对象加一段serialVersionUID代码,如果还报InvalidClassException,将redis上的老数据清除

private static final long serialVersionUID = 1L;

方法2:兼容老数据,找到老数据的serialVersionUID,就是上述报错的地方,会将老数据的serialVersionUID报出来,比如我这里的老数据的就是1631280650588763177 这一串,你只要加 UID=1631280650588763177 这个就可以了。

private static final long serialVersionUID = 1631280650588763177L;

四、总结

可能好多人在写对象以及序列化对象的时候,是没有加private static final long serialVersionUID的,但是也没有见到有报InvalidClassException异常的,那是因为你部署的单体系统架构,实时序列化和反序列化的,每次系统重启就又重新实例对象,所以即使改变了对象增加属性,也不会出现老对象和新对象serialVersionUID 不一致的情况,所以也就不会出现java. io. InvalidClassException。

所以以后你们写对象并且要序列化的话,一定要随手加上serialVersionUID这段代码。

如果你们去看源码,HashMap、ArrayList 等这些神级代码的时候,你们可以看到,他们都是加了 serialVersionUID 代码的

五、使用idea工具自动生成

1、按照下图所示,设置好后,不要忘记点击【Apply】应用一下

2、在实现了 Serializable的bean类下, 鼠标移到bean类名处,按住 alt+enter,就会自动弹出【Add serialVersionUID field】

选中即可自动生成啦,


参考文章:

https://blog.csdn.net/z3278221/article/details/90298812

感谢原作者的分享,让技术人能够更快的解决问题

[已解决]报异常java.io.InvalidClassException的解决方法|对象序列化实现Serializable会出现java.io.InvalidClassException的异常相关推荐

  1. Java学习之路3——方法定义、调用【重拾Java】

    Java学习之路3--方法定义.调用[重拾Java] 方法定义 为什么要写方法 方法完整的定义形式.调用 方法定义的格式 修饰符 返回值类型 返回值 调用格式 方法重载 方法定义 为什么要写方法 对于 ...

  2. java内容寻址_java – 获取方法对象而不按名称寻址方法

    有没有办法获取方法对象而不必使用方法的名称来获取它? 例如,我有班级: class Car { public String drive(); public String giveUp(); publi ...

  3. Java讲课笔记27:RandomAccessFile与对象序列化

    文章目录 零.本讲学习目标 1.掌握RandomAccessFile类的基本使用 2.熟悉Java中的对象序列化 一.RandomAccessFile (一)RandomAccessFile概述 (二 ...

  4. java中形参不可以是对象吗_(重要)java都是值传递,与对象形参所指向的对象改变,其实参所指向的对象也相应改变并不矛盾(2011年9.30日一天写的两个程序的总结结果)...

    1.0建立二叉树的代码,在java中必须创建二叉树的方法必须用返回值,因为不存在c语言中的引用传递,在java中只有值传递 代码1为正确,代码2(没有使用返回值)为错误.那么为什么之前的例子中将对象作 ...

  5. java字符串转数组的方法,写给正在求职的Java开发

    第一个 Java相关 1.1 美团面试Java问题 JVM内存模型 GC垃圾回收算法 讲解新生代 老年代 java的基本类型有哪几个?String是不是java的基本类型?String为什么要是fin ...

  6. java多线程实现电梯_面对对象第二单元总结 - 电梯(java多线程)

    概述 刚刚过去的oo第二单元主要是来训练我们java多线程设计. 借助电梯这个载体,逐步深入,线程的信息交互,控制也随之复杂. 尽管,我本单元成绩不是很好看,但是,确实学到了不少东西. 下面,我就借助 ...

  7. JAVA使用ByteArrayOutputStream、ByteArrayInputStream将对象序列化反序列化,通过JAVA socket实现对象在网络中传输

    1.序列化和反序列化: 序列化是对象(类的实例)转换成字节数组或者字符串通过网络传输或者存储到本地文件.反序列化:就是将字节数组或字符串在转换成对象实例的过程. (因为在网络中传输或者写本地文件,是不 ...

  8. java 对象排重_现代化的 Java (八)——重说对象序列化

    事故 昨晚上准备把 sequences 服务扔到我的旧笔记本上然后写下单系统,然后发现一个很囧的事情-- 消息序列化竟然失败了. 翻过去的代码,逐个排除问题,基本上结论是:因为过去我的测试写的太简单, ...

  9. jni java参数签名,什么是“方法签名”参数调用使用JNI的Java方法?

    I want to call an Android Java method using JNI in Qt. There is a weird "Method Signature" ...

最新文章

  1. kaptcha验证码实现,配合spring boot使用
  2. apache AllowEncodedSlashes 允许URL中对路径分隔符进行编码
  3. mysql ndb_mysql8 参考手册--MySQL NDB群集8.0
  4. 用遗传算法进行智能排课,相信老师会很喜欢
  5. C语言程序设计 认识函数
  6. 运维自动化之何为版本控制?
  7. 向数据库插入数据时出现乱码 --设置连接数据库的编码
  8. 2.业务架构·应用架构·数据架构实战 --- TOGAF理论全景解读
  9. Jensen不等式概率论形式的证明
  10. 高速下载百度网盘资料(Tampermonkey+百度网盘直链下载助手+xdown)
  11. 全志r16android sdk,全志R16的android4.4.2平台點亮gc2145(evb30)版本:V1.1(分色排版)...
  12. 手写BundleAdjustment(尽量仅使用eigen库)
  13. 计算机关机界面卡住,Win7关机缓慢,关机后一直卡在正在关机界面
  14. 水洼数 DFS 蓝桥杯 java代码
  15. GetDC、GetDCEx、GetWindowDC - [Daily APIs]
  16. Stream流分组求和
  17. C++面向对象程序设计实验题:有理数类(分数类)设计
  18. 丢人!35岁软件工程师:因涉嫌欺诈150万美元抗疫贷款被捕
  19. L3-1 千手观音【拓扑排序】
  20. minecraft服务器搭建教程_我的世界服务器创建教程

热门文章

  1. 彩超探头频率高低的区别_【干货】超声探头及使用技巧
  2. kali linux 中的网卡驱动,kali linux 安装Realtek 8812AU网卡驱动
  3. 使用DHCP动态管理主机地址
  4. MindManager2022Mac版本支持导入XMind、FreeMind文件格式
  5. 计算机技术与软件专业技术资格(水平)考试—— 软考中级 网络工程师笔记six
  6. 分支限界法求解旅行商问题(TSP)
  7. Echarts 雷达图 鼠标移入标签名 显示悬浮框
  8. java小学数学考试试题,借助小学数学题复习java基础
  9. 怎么修改linux系统时区,Linux如何修改系统时间和时区
  10. Flask—静态资源配置