开发者

redis反序列化报错原因分析以及解决方案

开发者 https://www.devze.com 2023-03-16 08:59 出处:网络 作者: 回首掏88
目录Redis反序列化报错原因分析序列化id’不一致实体类属性不一致redis序列化转换类型报错总结redis反序列化报错http://www.devze.com原因分析
目录
  • Redis反序列化报错原因分析
    • 序列化id’不一致
    • 实体类属性不一致
  • redis序列化转换类型报错
    • 总结

      redis反序列化报错http://www.devze.com原因分析

      问题:Cannot deserialize,无法反序列化

      分析:

      序列化id’不一致

      1、实体类实现了序列化接口后,没有指定序列化id。

      2、读和写的class版本不一致,srpingboot jar包版本不一致的两个class文件,序列化id不一致。因为我们项目是几个系统对接,共享的一个redis库。

      redis反序列化报错原因分析以及解决方案

      实体类属性不一致

      可能存到redis的时候是两个属性,但是我们本地业务扩展,新增了一些字段,也是无法完成反序列的。这个时候需要及时清理掉缓存库

      解决方案:

      redis序列化转换类型报错

      Cannot convert value of type 'org.springframework.data.redis.core.convert.MappingRedisConverter' to required type 'orgwww.devze.com.springframework.data.redis.core.mapping.RedisMappingContext': no matching editors or conversion strategy found

      在setValue的序列化方式的时候报错,原来是用的RedisSerializer.json()方法,但是报错,

      template.setConnectionFactory(factory);
          // key序列化方式
          template.setKeySerializer(RedisSerializer.string());
          // value序列化方式
          template.setValueSerializer(RedisSerializer.json());
          // hash key的序列化方式
          template.setrtkcpZkfHashKeySerializer(RedisSerializer.string());
          // hash value的序列化方式
          template.setHashValueSerializer(RedisSerializer.json());

      改成如下即可解决:

      template.setConnectionFactory(factory);
          // key序列化方式
          template.setKeySerializer(RedisSerializer.string());
          // value序列化方式
          template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
          // hash key的序列化方式
          template.setHashKeySerializer(RedisSerializer.string());
          // hash value的序列化方式
          template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

      在Redis中,有多种序列化实现可供选择。其中,Jackson2JsonRedisSerializer和RedisSerializer.json()都是Redis中的序列化实现。

      它们的区别如下:

      Jackson2JsonRedisSerializer使用Jackson库将Java对象序列化为JSON格式的字符串,并将其存储到Redis中。它还可以将从Redis中读取的JSON字符串反序列化为Java对象。

      因此,使用Jackson2JsonRedisSerializer可以方便地处理JSON格式的数据,并且对于复杂的Java对象可以进行较好的序列化和反序列化。

      但是,它可能会在序列化过程中忽略一些Java对象中的字段,因此需要进行一些配置才能完全控制序列化过程。

      RedisSerializer.json()使用Redis的内置JSON序列化器,将Java对象序列化为JSON格式的字符串,并将其存储到Redis中。它也可以将从Redis中读取的JSON字符串反序列化为Java对象。

      与Jackson2JsonRedisSerializer相比,RedisSerializer.json()在序列化过程中会将所有Java对象中的字段都js序列化到Redis中,但在处理复杂Java对象时,可能需要进行一些额外的配置。

      因此,选择哪种序列化方式取决于使用场景和具体需求。如果需要处理复杂的Java对象,并且对序列化和反序列化的精细控制比较关键,那么Jackson2JsonRedisSerializer是一个更好的选择。

      而如果处理的数据较为简单,或者只需要简单地将Java对象转换为JSON格式的字符串进行存储,那么RedisSerializer.json()可能更适合。

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消