首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GenericFastJsonRedisSerializer的RedisTemplate无法反序列化父类属性

使用GenericFastJsonRedisSerializer的RedisTemplate无法反序列化父类属性
EN

Stack Overflow用户
提问于 2021-07-09 15:32:11
回答 2查看 34关注 0票数 0

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

代码语言:javascript
复制
@Data
public class People implements Serializable {
    public Long id;
    public String name;
}

@EqualsAndHashCode(callSuper = true)
@Data
public class Student extends People{
    private String sName;
}
代码语言:javascript
复制
    @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;
    }
代码语言:javascript
复制
    @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

EN

回答 2

Stack Overflow用户

发布于 2021-07-09 17:19:24

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

解决方案二:将父类属性转换为子类属性;

票数 0
EN

Stack Overflow用户

发布于 2021-07-09 20:01:53

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

代码语言:javascript
复制
public class People implements Serializable {

private static final long serialVersionUID = 7156526077883281623L;

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68312906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档