导读
在一次操作中,本地项目怎么测试都没问题,然后想将项目打包放到服务器上(此前已经发布过,现在是新的版本迭代)。因为使用的SVN,后面单独拉去项目,打包前测试,页面无数据,审查发现报错。
介绍
请求返回出现的出现的错误如下:
{success: false,…}
data: null
msg: "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.demo.entity.AnalysisVO; local class incompatible: stream classdesc
serialVersionUID = -4425485891776102804,
local class serialVersionUID = -4559181614148555468"
success: false
total: null
问题原因
经查询,我发现该类的两个属性的类型我修改了,之前线上部署的时候使用的是String类型,后面因为需求,改成Integer类型了,而且服务器加了Redis缓存(我本地将缓存@Cacheable
注释了,所以本地可以),但是因为线上加了缓存,原本的Redis序列化为String类型的,但是我新上传的是Integer类型,导致缓存反序列化的结果和需要的不一致,出现以下错误。
@Data
public class AnalysisVO implements Serializable {
//注意:最好加上版本号,不然默认是使用的JVM自动生成的,默认的更容易出现问题
private static final long serialVersionUID = -4425485891776102804L;
private String outTotal; //后面该成Integer了
private String appTotal; //后面该成Integer了
}
解决办法
很简单,删除缓存,再次从数据库查询,就可以直接显示真实的数据了,也不会报这个错误了。
总结
如果想避免出现这种问题,可以再发布前清除该部分缓存,这样就可以避免该状况了。