【问题标题】:RedisTemplate use GenericFastJsonRedisSerializer can't deserialize parent class attributesRedisTemplate 使用 GenericFastJsonRedisSerializer 无法反序列化父类属性
【发布时间】:2021-07-09 20:01:52
【问题描述】:

首先,我创建一个父类实现Serializable,然后创建一个子类来扩展它。我使用 RedisTemplate 和 GenericFastJsonRedisSerializer 配置将数据放入 redis,但是当我从 Reids 取回数据时,数据已更改。请告诉我为什么以及如何修复它?

@Data
public class People implements Serializable {
    public Long id;
    public String name;
}

@EqualsAndHashCode(callSuper = true)
@Data
public class Student extends People{
    private String sName;
}

    @Bean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        RedisSerializer keySerializer = new StringRedisSerializer();
        RedisSerializer valueSerializer = new GenericFastJsonRedisSerializer();

        redisTemplate.setDefaultSerializer(valueSerializer);
        redisTemplate.setKeySerializer(keySerializer);
        redisTemplate.setValueSerializer(valueSerializer);
        redisTemplate.setHashKeySerializer(keySerializer);
        redisTemplate.setHashValueSerializer(valueSerializer);

        RedisUtil.init(redisTemplate);
        return redisTemplate;
    }
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void cacheDeserialize(){
        Student student = new Student();
        student.setId(11111111111111111L);
        student.setName("parent name");
        student.setSName("child name");
        redisTemplate.opsForValue().set("parent-child-test", student);
        Object value = redisTemplate.opsForValue().get("parent-child-test");
        System.out.println(value); // print:Student(sName=child name), but I wish it print Student(id=111111111,name=parent name,sName=child name)
    }

但是: Test result image

【问题讨论】:

    标签: java redis


    【解决方案1】:

    解决方案一:在智利类中使用 Lombok.annotation @ToString(callSuper = true);

    解决方案二:将父类属性带到子类;

    【讨论】:

      【解决方案2】:

      您需要使用 Serializable 实现这两个类并像这样定义 serialVersionUID

      public class People implements Serializable {
      
      private static final long serialVersionUID = 7156526077883281623L;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多