反序列化失败SerializationException: Cannot deserialize; nested exception is
1.报错信息
ERROR com.lanwon.publics.main.common.auth.Auth2ResponseExceptionTranslator -oauth2:
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.***.publics.main.common.auth.sms.SmsAuthenticationToken;local class incompatible:stream classdesc serialVersionUID = 485756941561672698, local class serialVersionUID = -1
at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:84)
2.问题原因
从报错信息中可以看出:
SerializationException
(序列化异常)指示无法进行反序列化。SerializationFailedException
(序列化失败异常)表明反序列化负载失败。InvalidClassException
(无效类异常)表示存在不兼容的类版本。
更具体地说,问题出现在反序列化 com.***.publics.main.common.auth.sms.SmsAuthenticationToken
类时。该类的版本与序列化时的版本不兼容。序列化时的流版本的 serialVersionUID
值为 485756941561672698
,而本地类的版本为 -1
。
3.解决方案
解决此问题的方法可能包括:
- 确保在进行序列化和反序列化时使用相同版本的类。
- 根据报错信息中提供的
SmsAuthenticationToken
类的详细信息,检查该类是否被修改过,并且在序列化和反序列化之间保持一致性。 - 如果有必要的话,尝试手动指定
serialVersionUID
的值以匹配序列化时的版本。
4.修复问题
-
出现该问题是在
SmsAuthenticationToken
类中新增了字段。 -
因为我这边是同一个
java
服务进行序列化和反序列化。所以不存在上述的三个可能方案。 -
尝试手动指定
serialVersionUID
的值确定不是该问题导致。 -
回头仔细看日志,注意到这一段
org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:84)
Oauth
使用的是redis
进行序列化和反序列化,因此考虑是redis
缓存。清空了redis
缓存数据,问题解决。