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);

画像の説明を追加してください
このように設定すると、完全なクラス名は追加されません

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

ここに画像の説明を挿入

完全修飾クラス名を追加する利点

完全なクラス名情報をシリアル化された JSON 文字列に追加すると、次のような効果が得られます。

  1. タイプ セーフティ:完全修飾クラス名情報を追加すると、逆シリアル化時に JSON 文字列が対応するオブジェクトに正しく変換されます。型情報は、デシリアライザーが正しいオブジェクト型を識別してインスタンス化するのに役立ち、データ損失や型変換エラーを回避します。

  2. ポリモーフィズムのサポート:完全なクラス名情報を追加することで、逆シリアル化時にオブジェクトのポリモーフィズムを復元できます。シリアル化されたオブジェクトが具体的なサブクラスのインスタンスであっても、逆シリアル化されると、基底クラスやインターフェイス型だけでなく、そのサブクラスのオブジェクトに正しく戻ります。

  3. バージョンの互換性:クラス名の情報は、バージョンの移行と互換性を処理するのに役立ちます。オブジェクトのクラス名またはクラス構造を変更すると、デシリアライザーはクラス名情報を使用して、デシリアライゼーションの失敗やデータ損失を引き起こすことなく新しいクラス構造に適応できます。

JSON 文字列に完全なクラス名情報を追加すると、シリアル化された文字列の長さが長くなり、記憶域スペースとネットワーク送信コストが増加する可能性があることに注意してください。したがって、完全なクラス名情報を追加するかどうかを決定するときは、アプリケーションの特定のニーズとパフォーマンス要件を考慮する必要があります。

おすすめ

転載: blog.csdn.net/qq_45796667/article/details/130837242