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

时间:2015-04-24 21:00:36

标签: jackson

某些界面,例如ResolvableSerializer& ContextualSerializer,修改杰克逊处理JsonSerializer的方式。

还有其他类似的接口吗?

Jackson是否曾修改JsonSerializer的子类的行为,例如StdSerializerBeanSerializerBaseBeanSerializer? (当然,除了通过标准多态性之外;我说的是instanceofClass.isAssignableFrom()之类的东西。)

在我编写的modifySerializer子类中的BeanSerializerModifier的实现中,我返回了包含参数JsonSerializer的{​​{1}}的子类。此包装器仅覆盖两种方法:

  • JsonSerializer:仅当满足某些条件时才会在包装的序列化程序上调用序列化
  • serialize:返回包装的序列化程序

问题:

  1. 我的包装器应该扩展getDelegatee的某些子类而不仅仅是JsonSerializer吗?
    1. 如果是的话,子类是否应该依赖于包装的序列化程序的类?
  2. 我的包装器应该重载其他任何方法吗?
  3. 我的包装器应该实现与包装序列化器相同的序列化修饰符接口吗?如果是这样,那么有两个问题:
    1. 我必须知道每个修饰符界面,并更新我的JsonSerializer以处理添加到杰克逊的任何新修饰
    2. 我需要为每个修饰符接口组合使用不同的包装类,这非常麻烦

1 个答案:

答案 0 :(得分:1)

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

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