今天写代码时候遇到一个异常,异常信息如下:

Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: 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.aa.bb.generic.cc.dto.module.ModuleGoodsDTO; local class incompatible: stream classdesc serialVersionUID = -526324944915280489, local class serialVersionUID = 4094977077022888368

Caused by: 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.aa.bb.generic.cc.dto.module.ModuleGoodsDTO; local class incompatible: stream classdesc serialVersionUID = -526324944915280489, local class serialVersionUID = 4094977077022888368

Cannot deserialize,很明显,反序列化异常。特别注意这一句:redis.serializer.SerializationException: Cannot deserialize,用了Redis存储对象列表,取对象列表时候反序列化出错了。在代码里有这一行 Map> moduleIdGoodsListMap = (Map>) redisClient.get(RedisKeyConstant.GOODS_INFO_LIST+currentModuleInfo.getId()); 这里stream classdesc serialVersionUID = -526324944915280489,local class serialVersionUID = 4094977077022888368,两个serialVersionUID不一致,反序列化异常。

回想了一下,我给ModuleGoodsDTO类新增加了1个字段categoryId,但是ModuleGoodsDTO类前面加了 @SuppressWarnings("serial"),没有注明 serialVersionUID,这样新增(修改或删除)了字段,local class serialVersionUID 默认是会自动变化的。

才想起来serialVersionUID的作用:

序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

有两种生成方式:

一个是默认的1L,比如:private static final long serialVersionUID = 1L;

一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:

private static final long serialVersionUID = xxxxL;

当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供黄色警告,如果没有考虑到兼容性问题时,不管或者简单的加一个 @SuppressWarnings("serial") 注解,就会出现上述问题。

如果你的类Serialized序列化存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。

但当serialVersionUID设置相同时,它就会将不一样的field以type的预设值(属性默认值)Deserialize,可避开不兼容性问题。

这里给类 ModuleGoodsDTO 加上 private static final long serialVersionUID = -526324944915280489L; 就好了。

java反序列化异常接不到_由Java对象反序列化异常想到的相关推荐

  1. java后台传一个对象到前台_前台判断对象中的一个布尔值_springMVC面试题

    1:springMVC工作原理 springMVC架构.png [用户发送请求到前端控制器dispatcherservlet,前端控制器接收到请求之后调用处理器映射器,根据请求url找到具体的处理器, ...

  2. java中的深度克隆浅克隆_了解Java中的可克隆接口

    java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...

  3. java多线程做一件事_关于Java的十件事

    java多线程做一件事 那么,您从一开始就一直在使用Java? 还记得那些被称为" Oak"的日子,OO仍然是热门话题,C ++人士认为Java没有机会,Applet还是一件事吗? ...

  4. 蓝桥杯java能用编译器1吗_学java的你,这些英文单词都掌握了吗?

    1.Abstract class 抽象类:抽象类是不允许实例化的类,因此一般它需要被进行扩展继承. 2.Abstract method 抽象方法:抽象方法即不包含任何功能代码的方法. 3.Anonym ...

  5. java实验1机动车实验目的_《Java程序设计》实验指导书.doc

    <Java程序设计>实验指导书 实验一.熟悉JDK环境及主要命令 一.实验目的 1) 熟悉JDK的环境配置 2) 掌握JDK的命令 3) 掌握Java Application程序的开发过程 ...

  6. java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回 ...

  7. java在哪一年面世_显示java时候

    常见的3种Class级别的错误 ClassNotFoundException 很明显,这个错误是找不到类异常,即在当前classpath路径下找不到这个类. ClassNotFoundExceptio ...

  8. java应用程序占用高内存_对Java应用程序中的内存问题进行故障排除

    java应用程序占用高内存 重要要点 解决内存问题可能很棘手,但是正确的方法和正确的工具集可以大大简化此过程. Java HotSpot JVM可以报告几种OutOfMemoryError消息,因此务 ...

  9. java基础入门课后习题答案_《Java基础入门》课后习题及答案

    <Java基础入门>课后习题及答案Java基础入门,课后习题,答案 博学谷--让IT教学更简单,让IT学习更有效 第6章JavaAPI 一.填空题 1.在Java中定义了两个类来封装对字符 ...

最新文章

  1. 学javascript有哪些开发工具
  2. android进程与线程详解三:AsyncTask
  3. solr 启动时指定 solr.home
  4. 使用ubuntu系统中遇到的问题及解决方案
  5. Linex第三章第四章
  6. 负载均衡 一直跑一个服务器_终于把服务器负载均衡和客户端负载均衡讲清楚了...
  7. 软件工程师证书怎么考_2020年想考一个证书,考一级造价工程师还是考咨询工程师?...
  8. matlab数据变成一列数据,用MATLAB处理EXCEL中一列共100000个数据,请问如何将数据导入并将数据做正态曲线拟合...
  9. turtle库使用——谢尔宾斯基三角形
  10. 每天看一个fortran文件(2)
  11. excel 分组排序,取前5
  12. 交通·未来系列学术活动第1期:时空交通数据预测方法及应用
  13. java多线程之线程安全----铁路售票系统的实现
  14. 关于FileWrite写入文本后,打开文本发现是空的
  15. Social Justice Awards秋季赛正式启动
  16. 流言终结者 1080P全高清都等于高画质?
  17. 实在智能“数字员工”发布,谈AI+RPA发展趋势,发布SaaS平台,并开源可供开发者下载打造小型机器人
  18. 程序员必看的数组详解!
  19. 创建对象的几种方法的总结
  20. c int 转 char_C博客作业01--分支、顺序结构 - min小王

热门文章

  1. CentOS7搭建ftp服务器(vsftpd,亲测成功)
  2. servlet+JQuery ajax以json的形式的验证表单小实例
  3. c语言程序设计教程本科,新编C语言程序设计教程(本科)第5篇.pdf
  4. python小孩的报酬_孩子做了家务,家长该不该支付“酬劳”呢?
  5. Java并发编程实战_福州java编程实战培训班排名
  6. java 小数处理_java 小数点处理
  7. 启动盘Linux windows,Linux 中创建 USB 启动盘来拯救 Windows 用户
  8. idea代码补全声明代码_用了这么多年idea,竟然不知道这些代码补全功能
  9. Python可以调用Gpu吗_python可以开发app吗
  10. arduino 土壤温湿度传感器_【雕爷学编程】Arduino动手做(70)---土壤湿度传感器...