采用Jackson2JsonRedisSerializer 序列化/反序列化对象
问题:序列化和反序列化String数组,反序列化异常
对String数组进行序列化时会省略其类型的描述,直接进行存储,因此导致反序列化时认为“a”是一个类型参数,导致反序列化失败,该问题作者暂未发现解决方法。
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//创建RedisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//创建字符串序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); //创建json序列化
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//配置json 序列化
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//key 使用string序列化
redisTemplate.setKeySerializer(stringRedisSerializer);
// value 使用json序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// hash 的key使用string序列化
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// hash value 使用json序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
采用GenericFastJsonRedisSerializer 序列化/反序列化对象(推荐使用)
问题:序列化和反序列化Object类数组 ,反序列化报异常
GenericFastJsonRedisSerializer是将数组反序列化为JSONArray ,查看JSONArray类的定义就可以看出其是一种List集合,所以将其强转为User数组就会报错。
解决办法:
修改反序列化后的强转类型,就没有异常信息了。
// User 为被序列化的对象
List<User> valueRedis = (List<User>)RedisUtils.get("key");
@Bean
RedisTemplate<String,Object> redisTemplate1(RedisConnectionFactory redisConnectionFactory){
//创建RedisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//创建字符串序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); //创建json序列化
GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
//key 使用string序列化
redisTemplate.setKeySerializer(stringRedisSerializer);
// value 使用json序列化
redisTemplate.setValueSerializer(genericFastJsonRedisSerializer);
// hash 的key使用string序列化
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// hash value 使用json序列化
redisTemplate.setHashValueSerializer(genericFastJsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}