Redis序列化和反序列化失败: org.springframework.data.redis.serializer.SerializationExceptionng

报错提示

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、序列化和反序列化失败

参考文章:
springboot集成redis时报错
SpringBoot集成Redis,并自定义对象序列化
RedisTemplate操作redis时,key值出现\xac\xed\x00\x05t\x00前缀

`ClassNotFoundException: org.springframework.data.redis.serializer.RedisSerializer` 是一个在尝试加载特定类时抛出的异常。这个类通常出现在 Spring Data Redis 应用程序试图实例化 `RedisSerializer` 类时失败了。 Spring Data Redis 使用 `RedisSerializer` 接口提供序列化反序列化的功能,用于将 Java 对象转换为 Redis 中的字符串形式以及反之亦然。常见的实现包括 `StringRedisSerializer`、`GenericJackson2JsonRedisSerializer` 等。 当这个异常发生时,通常是由于以下原因之一: 1. **类路径错误**:可能是因为项目依赖缺失或者版本冲突导致无法找到正确的 `RedisSerializer` 实现类文件。 2. **配置错误**:Spring 配置可能没有正确地指定应该使用的 `RedisSerializer` 实例,或者在自定义实现时未能正确导入依赖。 3. **类名拼写错误**:可能是 `RedisSerializer` 的类名输入有误,在配置或者直接引用时出现了错拼。 处理这类异常的一般步骤: - 检查并更新项目的 Maven 或者 Gradle 构建文件,确保所有依赖项都已正确添加并且版本兼容。 - 如果你在配置中自定义了 `RedisSerializer`,检查配置是否准确无误,并确保导入了相应的依赖。 - 使用IDE或者运行工具如 IntelliJ IDEA 的 'Run' -> 'Edit Configurations...' 打开配置编辑界面,检查应用上下文中的 Spring Boot 配置,尤其是关于 Redis 的部分,确认 `RedisSerializer` 类型设置正确。 - 查看具体的堆栈跟踪信息,这通常会提供更多关于异常发生的源代码位置的信息,有助于定位问题所在。 ### 解决方案示例 如果你正在使用默认的 `StringRedisSerializer` 并遇到上述异常,只需确认你的项目构建文件已经包含了 Spring Data Redis 相关依赖即可。例如,在 Maven 的 `pom.xml` 文件中,你应该看到类似下面的依赖声明: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 如果使用的是其他类型的 `RedisSerializer`,比如 `GenericJackson2JsonRedisSerializer`,确保你也相应地导入了其依赖包。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值