Jackson 2.x 系列【18】序列化器创建工厂 SerializerFactory-2. SerializerFactory

时间:2024-04-11 19:04:30

SerializerFactory抽象类提供给SerializerProvider用于创建JsonSerializer实例,以执行序列化操作。定义了抽象类可以让序列化过程可以更加灵活和定制化,具体的实现细节和策略则留给继承这个抽象类的子类来实现。

SerializerFactory继承结构如下:

在这里插入图片描述

SerializerFactory声明了三个with开头的抽象方法:

    public abstract SerializerFactory withAdditionalSerializers(Serializers additional);

    public abstract SerializerFactory withAdditionalKeySerializers(Serializers additional);

    public abstract SerializerFactory withSerializerModifier(BeanSerializerModifier modifier);

withAdditionalSerializerswithAdditionalKeySerializers方法创建一个新的工厂实例,并在创建过程中添加额外的序列化器,在自定义序列化器的时候回用到,示例代码如下:

        // 创建 ObjectMapper
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 获取原有的 SerializerFactory
        SerializerFactory serializerFactory = objectMapper.getSerializerFactory();
        // 创建额外序列化器
        SimpleSerializers simpleSerializers=new SimpleSerializers();
        simpleSerializers.addSerializer(new SqlBlobSerializer());
        // SerializerFactory 添加自定义的序列化器
         SerializerFactory newSerializerFactory = serializerFactory.withAdditionalSerializers(simpleSerializers);
        // 重新设置给 ObjectMapper(因为SerializerFactory 是不可变对象, with 方法返回新的实例)
        objectMapper.setSerializerFactory(newSerializerFactory);

withSerializerModifier方法创建一个新的工厂实例,并在创建过程中添加额外的BeanSerializerModifier

Java BeanJSON的转换过程是比较复杂的,因为一般对象都包含了多种类型的属性, 之前有了解过Java Bean调用的是BeanSerializer执行的序列化,而BeanSerializerModifier则是这个序列化类的修改器,Jackson提供了扩展机制用于添加一些自定义的处理逻辑。

此外还声明了多个创建序列化器的方法:

    /**
     * 给指定的类型创建序列化器,对于不可变的序列化器,这个方法可能会选择重用现有的序列化器实例,而不是创建一个新的。
     *
     * @param prov     SerializerProvider(提供者,仅用于解析由注解指定的序列化器,而不用于其他类型的序列化器)
     * @param baseType 声明的类型,用作类型信息序列化器的基础类型
     * @return
     * @throws JsonMappingException
     */
    public abstract JsonSerializer<Object> createSerializer(SerializerProvider prov,
                                                            JavaType baseType)
            throws JsonMappingException;

    public abstract TypeSerializer createTypeSerializer(SerializationConfig config,
                                                        JavaType baseType)
            throws JsonMappingException;

    // 创建负责处理 Map 的键的序列化器
    public JsonSerializer<Object> createKeySerializer(SerializerProvider prov,
                                                      JavaType type, JsonSerializer<Object> defaultImpl)
            throws JsonMappingException {
        return createKeySerializer(prov.getConfig(), type, defaultImpl);
    }

    @Deprecated // since 2.11
    public abstract JsonSerializer<Object> createKeySerializer(SerializationConfig config,
                                                               JavaType type, JsonSerializer<Object> defaultImpl)
            throws JsonMappingException;