Redis序列化和反序列化失败问题及解决org.springframework.data.redis.serializer.SerializationExceptionng

 更新时间:2026年09月07日 08:57:48   作者:温娉哲  
遇到SpringBoot RedisTemplate序列化异常?本文帮你分析SerializationException:Cannot deserialize的根源,教你如何把默认JDK序列化换成StringRedisSerializer和GenericJackson2JsonRedisSerializer,彻底解决乱码、取值null和反序列化失败问题

报错提示

org.springframework.data.redis.serializer.SerializationException: 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.StreamCorruptedException: invalid stream header: 3139322E

原因

SpringBoot使用spring-data-redis,RedisTemplate默认的序列化方式是用org.springframework.data.redis.serializer.JdkSerializationRedisSerializer这个类来做序列化,而Redis有自己的序列化方式,所以冲突了 报出了上面的序列化异常的信息。

从RedisTemplate源码中找到了原因:

解决

在使用到redisTemplate的类中加入下面的配置,指定使用的序列化方式:

将key序列化方式改为 StringRedisSerializer,将value序列化方式改为 GenericJackson2JsonRedisSerializer 。

    private RedisTemplate<String, QuestionTemplate> redisTemplate;
    //指定用redis的序列化方式进行序列化
    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();//序列化为String
        //不能反序列化
        //Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//序列化为Json
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(serializer);
        this.redisTemplate = redisTemplate;
    }

注意:

Jackson2JsonRedisSerializer可以序列化成功,但是反序列化会失败,所以建议用GenericJackson2JsonRedisSerializer即可序列化也可反序列化。

1、由Jackson2JsonRedisSerializer 序列化产生的格式:

2、由GenericJackson2JsonRedisSerializer 序列化产生的格式:

由序列化冲突导致的问题有

1、redis数据库有值, 但是用redisTemplate根据key获取value值为 null

2、存入redis数据库中字符乱码,字符串前缀出现\xac\xed\x00\x05t\x00\x10(但是不影响读写)

3、序列化和反序列化失败

总结

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

相关文章

  • redis列表类型_动力节点Java学院整理

    redis列表类型_动力节点Java学院整理

    这篇文章主要为大家详细介绍了redis列表类型的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Redis数据结构之Set结构详解

    Redis数据结构之Set结构详解

    本文介绍了Redis中Set集合的数据结构,主要其Int种两种编码方式IntSet和Dict以及如何根据数据特征自动切换,IntSet通过紧凑的整数布局实现极致内存节省;Dict则提供高效的唯一性校验,两种编码方式和阈值机制共同实现了了Set的内存效率和操作性能的间的平衡
    2026-05-05
  • Redis 多规则限流和防重复提交方案实现小结

    Redis 多规则限流和防重复提交方案实现小结

    本文主要介绍了Redis 多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Redis锁的过期时间小于业务的执行时间如何续期

    Redis锁的过期时间小于业务的执行时间如何续期

    本文主要介绍了Redis锁的过期时间小于业务的执行时间如何续期,Redisson它能给Redis分布式锁实现过期时间自动续期,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Redis消息队列的三种实现方式

    Redis消息队列的三种实现方式

    本文主要介绍了Redis消息队列的三种实现方式,主要包括List实现消息队列,PubSub消息队列,Stream消息队列,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Unable to connect to Redis无法连接到Redis解决的全过程

    Unable to connect to Redis无法连接到Redis解决的全过程

    这篇文章主要给大家介绍了关于Unable to connect to Redis无法连接到Redis解决的相关资料,文中通过图文以及实例代码将解决的过程介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Redis连接与查询的实用操作指南

    Redis连接与查询的实用操作指南

    当我们需要深入排查缓存问题或验证数据一致性时,直接使用 redis-cli 是最有效的手段,但在此之前,你需要知道服务在哪、如何认证以及使用哪些命令,本文精简了冗余理论,直接提供可落地的操作步骤,跟着步骤走,快速解决你的 Redis 连接与查询难题,需要的朋友可以参考下
    2026-03-03
  • 如何利用Redis List实现Java数据库分页快速查询

    如何利用Redis List实现Java数据库分页快速查询

    这篇文章主要给大家介绍了关于如何利用Redis List实现Java数据库分页快速查询的相关资料,Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,需要的朋友可以参考下
    2024-02-02
  • Redis高可用梳理详解

    Redis高可用梳理详解

    高可用的本质是有备份,在出现故障的时候,有backup可以提供服务,本文详细介绍了Redis的高可用,感兴趣的同学可以参考阅读
    2023-05-05
  • Redis实现开机自启脚本(linux)

    Redis实现开机自启脚本(linux)

    本段文字主要介绍了在Linux系统中通过创建启动脚本和修改配置文件来实现Redis服务的开机自启动,并强调了使用chkconfig命令的重要性,通过本文,读者可以掌握Redis服务在Linux系统中的安装与配置方法
    2026-06-06

最新评论