Proyecto Spring Boot, referencia de código RedisTemplete de serialización y deserialización de Jackson (explicación detallada)

@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;
}

}

Nota complementaria

Estas pocas líneas de código agregarán el nombre completo de la clase a la cadena Json serializada.

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

Por favor agregue una descripción de la imagen.
Si se configura así, no se agregará el nombre completo de la clase

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

inserte la descripción de la imagen aquí

Beneficios de agregar nombres de clases completamente calificados

Agregar información completa del nombre de la clase a la cadena JSON serializada puede generar los siguientes efectos:

  1. Seguridad de tipos: agregar información de nombre de clase completa garantiza que las cadenas JSON se vuelvan a convertir correctamente en los objetos correspondientes al deserializar. La información de tipo ayuda al deserializador a identificar y crear instancias del tipo de objeto correcto, evitando la pérdida de datos o errores de conversión de tipos.

  2. Compatibilidad con polimorfismo: al agregar información completa del nombre de la clase, se puede restaurar el polimorfismo de los objetos al deserializar. Incluso si el objeto serializado es una instancia de una subclase concreta, volverá correctamente a un objeto de esa subclase cuando se deserialice, no solo a la clase base o tipo de interfaz.

  3. Compatibilidad de versiones: la información del nombre de la clase es útil para manejar la migración y la compatibilidad de la versión. Cuando modifica el nombre de clase o la estructura de clases de un objeto, el deserializador puede usar la información del nombre de clase para adaptarse a la nueva estructura de clases sin causar fallas de deserialización o pérdida de datos.

Cabe señalar que agregar información completa del nombre de clase a la cadena JSON puede aumentar la longitud de la cadena serializada, aumentar el espacio de almacenamiento y los costos de transmisión de red. Por lo tanto, al decidir si se agrega información completa del nombre de la clase, se deben considerar las necesidades específicas y los requisitos de rendimiento de la aplicación.

Supongo que te gusta

Origin blog.csdn.net/qq_45796667/article/details/130837242
Recomendado
Clasificación