问题描述:
前后端通过jwt进行交互时,登录后把用户信息存到redis中,访问接口时需要从redis中获取当前登录用户信息.线上登录后,保存了用户信息到redis,然后我本地在用户实体UserEntity中加多了下图的字段:
然后在从redis中获取用户信息时就出现报错:
org.springframework.data.redis.serializer.SerializationException
java.io.InvalidClassException: com..; local class incompatible: stream classdesc serialVersionUID = 5590259895198052390, local class serialVersionUID = 7673969121092229700
问题原因:
如果没有显式地定义一个serialVersionUID,只是实现了Serializable接口,那么Java会默认根据类信息计算一个serivalVersionUID出来。由于线上的UserEntity没有isLeader字段,我本地新增了isLeader字段,就导致线上和我本地生成的serialVersionUID是不一致的,所以在通过redisTemplate反序列化获取当前登录用户信息时,就会出现上面的报错.根本原因就是redis保存时的serialVersionUID与我本地获取时的serialVersionUID不一致导致的.
解决:
通过idea 显示生成一个serialVersionUID,这样就能保证线上与本地测试时的serialVersionUID一致.
操作步骤:
工具栏 -> File -> Editor -> Inspections
在搜索框中搜索:Serializable class without 'serialVersionUID’并勾选其所在行的复选框
按住Alt+Enter键提示“Add ‘serialVersionUID’ field”即可显示生成一个serialVersionUID