SerializerFactory
抽象类提供给SerializerProvider
用于创建JsonSerializer
实例,以执行序列化操作。定义了抽象类可以让序列化过程可以更加灵活和定制化,具体的实现细节和策略则留给继承这个抽象类的子类来实现。
SerializerFactory
继承结构如下:
SerializerFactory
声明了三个with
开头的抽象方法:
public abstract SerializerFactory withAdditionalSerializers(Serializers additional);
public abstract SerializerFactory withAdditionalKeySerializers(Serializers additional);
public abstract SerializerFactory withSerializerModifier(BeanSerializerModifier modifier);
withAdditionalSerializers
和withAdditionalKeySerializers
方法创建一个新的工厂实例,并在创建过程中添加额外的序列化器,在自定义序列化器的时候回用到,示例代码如下:
// 创建 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 Bean
和JSON
的转换过程是比较复杂的,因为一般对象都包含了多种类型的属性, 之前有了解过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;