一、异常详情
2023.07.07 11:20:10.195 ERROR [http-nio-9190-exec-1] Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed;
nested exception is 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.xxxx.xxxx.vo.McnListVo;
local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = -5384880232592800776] with root cause java.io.InvalidClassException: com.huitun.kuaishou.vo.McnListVo;
local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = -5384880232592800776
二、异常原因分析
- 没有固定serialVersionUID 值 ,即序列化类中没有增加
private static final long serialVersionUID = 1L;
当然也可不增加,但是要注意对象放入缓存中的使用。
2. redis缓存使用 即将结果出参类LiveRankVO设置进了缓存,且,后续更新代码时,该出参类LiveRankVO被修改,但是缓存中依然是修改前的旧对象。
三、异常解决办法
- 设置固定的serialVersionUID 值 ,即在序列化类中增加
private static final long serialVersionUID = 1L;
设置serialVersionUID 后,序列化和反序列化的时候不会因为对象修改后的serialVersionUID 不同而导致异常,若使用过缓存依然要及时清理缓存。
2. 清除redis缓存 将缓存中的旧对象数据清除后,重新缓存进去。(也是本人当时解决的办法),建议还是要规范实体类实现序列化,增加
固定的serialVersionUID,以免出错。