调用Redis相关API时遇SerializationException序列化异常求助
排查Redis反序列化ClassNotFoundException问题
检查Person类的定义与序列化配置
- 确认Person类的全限定名确实是
com.example.demospring.Person,排查包名、类名的拼写错误(包括大小写) - 确保Person类实现了
java.io.Serializable接口;若使用Jackson序列化,需确保类上有@Data、@NoArgsConstructor等必要注解 - 核对PersonConfig中的RedisTemplate配置,确认序列化器(如JdkSerializationRedisSerializer、Jackson2JsonRedisSerializer)的类型与存储数据时一致,且未指定错误的类路径
- 确认Person类的全限定名确实是
验证Redis存储的数据兼容性
- 用
redis-cli执行命令LRANGE person 0 -1,查看存储的原始数据格式:- 若为JDK序列化字节流,检查流中携带的类全限定名是否与当前项目的Person类完全匹配
- 若数据是用旧的序列化规则(或不同版本的Person类)存储的,先执行
DEL person清空旧数据,重新写入后再测试接口
- 用
排查项目构建与依赖问题
- 检查pom.xml中
spring-boot-starter-data-redis等Redis相关依赖的版本,避免依赖冲突 - 确认Person类已被正确编译打包:解压项目生成的jar包,查看
com/example/demospring目录下是否存在Person.class文件 - 多模块项目需确认Person类所在模块已被正确引入依赖,且完成编译构建
- 检查pom.xml中
解决类加载器相关问题
- 若使用自定义序列化器,确保反序列化时使用当前应用的类加载器。以Jackson序列化为例,配置示例:
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); Jackson2JsonRedisSerializer<Person> serializer = new Jackson2JsonRedisSerializer<>(Person.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(objectMapper); template.setValueSerializer(serializer); template.setHashValueSerializer(serializer); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); return template; }
- 若使用自定义序列化器,确保反序列化时使用当前应用的类加载器。以Jackson序列化为例,配置示例:
内容的提问来源于stack exchange,提问作者Sainath Macharla
相关产品推荐
相关产品推荐

