Spring Boot项目,Jackson序列化和反序列化RedisTemplete代码参考(详细解释)

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(factory);
    Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
    
    ObjectMapper objectMapper = new ObjectMapper();
    // 设置 ObjectMapper 的可见性,将所有属性设置为可见性,包括私有属性。
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    // 配置 ObjectMapper,在遇到未知属性时不会抛出异常。
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
    // 激活 ObjectMapper 的默认类型信息,将类型信息作为属性添加到 JSON 字符串中。
    objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
            ObjectMapper.DefaultTyping.EVERYTHING,
            JsonTypeInfo.As.PROPERTY);

    // objectMapper.deactivateDefaultTyping(); 这个配置不会添加全类名
    
    // 配置好的 ObjectMapper 设置到 jsonRedisSerializer 中。
    jsonRedisSerializer.setObjectMapper(objectMapper);
    
    // 设置 RedisTemplate 的值序列化器为 jsonRedisSerializer。
    redisTemplate.setValueSerializer(jsonRedisSerializer);
    // 设置 RedisTemplate 的键序列化器为 StringRedisSerializer。
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    
    // 设置 RedisTemplate 的哈希键序列化器为 StringRedisSerializer。
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    // 设置 RedisTemplate 的哈希值序列化器为 jsonRedisSerializer。
    redisTemplate.setHashValueSerializer(jsonRedisSerializer);
    // 对 RedisTemplate 进行必要的初始化。
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

}

补充说明

这几句代码会在序列化的Json字符串中添加全类名

objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
            ObjectMapper.DefaultTyping.EVERYTHING,
            JsonTypeInfo.As.PROPERTY);

Spring Boot项目,Jackson序列化和反序列化RedisTemplete代码参考(详细解释)_第1张图片
如果这样配置则不会添加全类名

objectMapper.deactivateDefaultTyping();  // 这个配置不会添加全类名

Spring Boot项目,Jackson序列化和反序列化RedisTemplete代码参考(详细解释)_第2张图片

添加全类名的好处

在序列化后的 JSON 字符串中添加全类名信息可以带来以下几个作用:

  1. 类型安全性: 添加全类名信息可以确保在反序列化时,能够正确地将 JSON 字符串转换回相应的对象。类型信息可以帮助反序列化程序识别并实例化正确的对象类型,避免数据丢失或类型转换错误。

  2. 多态性支持: 通过添加全类名信息,可以在反序列化时恢复对象的多态性。即使序列化的对象是某个具体子类的实例,也能够在反序列化时正确地还原为该子类的对象,而不仅仅是基类或接口类型。

  3. 版本兼容性: 类名信息对于处理版本迁移和兼容性非常有用。当你修改了对象的类名或类结构时,反序列化程序可以使用类名信息来适应新的类结构,而不会导致反序列化失败或数据丢失。

需要注意的是,将全类名信息添加到 JSON 字符串中可能会增加序列化后的字符串长度,增加存储空间和网络传输成本。因此,在决定是否添加全类名信息时,需要考虑到应用程序的具体需求和性能要求。

你可能感兴趣的:(中间件,spring,boot,java,spring)