导读


在一次操作中,本地项目怎么测试都没问题,然后想将项目打包放到服务器上(此前已经发布过,现在是新的版本迭代)。因为使用的SVN,后面单独拉去项目,打包前测试,页面无数据,审查发现报错。

介绍


请求返回出现的出现的错误如下:

  1. {success: false,…}
  2. data: null
  3. msg: "Cannot deserialize; nested exception is org.springframework.core.
  4. serializer.support.SerializationFailedException:
  5. Failed to deserialize payload. Is the byte array a result of corresponding
  6. serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException:
  7. com.demo.entity.AnalysisVO; local class incompatible: stream classdesc
  8. serialVersionUID = -4425485891776102804,
  9. local class serialVersionUID = -4559181614148555468"
  10. success: false
  11. total: null

问题原因

经查询,我发现该类的两个属性的类型我修改了,之前线上部署的时候使用的是String类型,后面因为需求,改成Integer类型了,而且服务器加了Redis缓存(我本地将缓存@Cacheable注释了,所以本地可以),但是因为线上加了缓存,原本的Redis序列化为String类型的,但是我新上传的是Integer类型,导致缓存反序列化的结果和需要的不一致,出现以下错误。

  1. @Data
  2. public class AnalysisVO implements Serializable {
  3. //注意:最好加上版本号,不然默认是使用的JVM自动生成的,默认的更容易出现问题
  4. private static final long serialVersionUID = -4425485891776102804L;
  5. private String outTotal; //后面该成Integer了
  6. private String appTotal; //后面该成Integer了
  7. }

解决办法

很简单,删除缓存,再次从数据库查询,就可以直接显示真实的数据了,也不会报这个错误了。

总结


如果想避免出现这种问题,可以再发布前清除该部分缓存,这样就可以避免该状况了。