Jackson BeanSerializerModifier.modifySerializer & 修改 JsonSerializer 处理方式的接口

Jackson BeanSerializerModifier.modifySerializer & interfaces that modify how a JsonSerializer is handled

某些接口,例如 ResolvableSerializerContextualSerializer,修改了 Jackson 处理 JsonSerializer 的方式。

还有其他这样的接口吗?

Jackson 是否曾为 JsonSerializer 的子 class 修改其行为,例如 StdSerializerBeanSerializerBaseBeanSerializer? (当然,除了通过标准多态性;我说的是 instanceofClass.isAssignableFrom() 等)

在我写的 BeanSerializerModifier 的子 class 中 modifySerializer 的实现中,我 return [=13= 的子class ] 包装参数 JsonSerializer。此包装器仅覆盖两种方法:

问题:

  1. 我的包装器是否应该扩展 JsonSerializer 的一些子 class 而不仅仅是 JsonSerializer
    1. 如果是这样,subclass 是否应该依赖于包装序列化程序的 class?
  2. 我的包装器是否应该重载任何其他方法?
  3. 我的包装器是否应该实现与包装的序列化器相同的序列化器修饰符接口?如果是这样,那么有两个问题:
    1. 我必须了解每个修改器界面,并更新我的 BeanSerializerModifier 以处理添加到 Jackson
    2. 的任何新界面
    3. 我需要为修饰符接口的每个组合都有不同的包装器class,这很麻烦

好问题。以下是一些想法:

  • 通常你应该扩展 StdSerializer 而不是 "raw" JsonSerializer.
  • 如果序列化为 JSON 标量值,您可能需要扩展 StdScalarSerializer
  • 基本类型通常不需要匹配,尽管如果委托给 CollectionMap 序列化程序,您可能希望这样做——但是,一般来说,您应该需要匹配。一旦你正确注意到它就会变得不切实际。
  • 关于重载:您可以选择重载一些方法,通常只是委托给被委托者:
    • 对于多态处理,定义"serializeWithType(...)"
    • isEmpty(),如果有与"empty"的概念相关的非空值:例如,字符串“”被认为是空的。
    • acceptJsonFormatVisitor() 是支持 JSON 架构生成和其他类型内省所必需的(例如生成 Avro、CSV 和 Protobuf 架构,使用匹配的数据格式模块)