Jackson 2.5+:必须通过包装从 BeanSerializerModifier.modifySerializer(...) 返回的 JsonSerializer 来覆盖哪些 JsonSerializer 方法?

Jackson 2.5+: what JsonSerializer methods must be overridden by wrapping JsonSerializer returned from BeanSerializerModifier.modifySerializer(...)?

使用 Jackson 2.5+,哪些 JsonSerializer 方法必须被包装覆盖 JsonSerializer returned from:

BeanSerializerModifier.modifySerializer(SerializationConfig sc, BeanDescription bd, JsonSerializer<?> js)

我肯定会重写 serialize(...),因为我正在根据重写中的属性值过滤掉一些对象,使其不被序列化。否则,如果对象没有被其 属性 值过滤掉,我通常通过调用 js.serialize(...) 进行序列化,其中 js 是作为参数传递给modifySerializer.

但我不确定是否还应该覆盖以下任何其他 JsonSerializer 方法:

  1. getDelegatee()
  2. replaceDelegatee(...)
  3. isUnwrappingSerializer()
  4. unwrappingSerializer(...)
  5. handledType()
  6. usesObjectId()
  7. isEmpty(T)
  8. isEmpty(SerializerProvider, T)
  9. acceptJsonFormatVisitor(...)
  10. serializeWithType(...)

例如,应该 getDelegatee() return js?

为什么我要让 replaceDelegatee(...) 取代 js 作为受托人?如果我允许这样做,那么我必须将 js 保存到一个字段以便我可以替换它。

根据我的其他回答,有些您确实想要(重新)定义,有些则不需要。 (1)、(8)、(9)、(10)确实有道理; (7) 已弃用,不再需要。 (5) 应该由 base class 定义(至少如果扩展 StdSerailizer),如果没有定义,应该主要定义,因为它被一些错误报告使用。

(3) 和 (4) 是您可能想要支持的东西,如果您希望为该类型实现 @JsonUnwrapped。如果您要委托给标准的 POJO 序列化程序,这可能是正确的。如果未实现,@JsonUnwrapped 基本上不会影响自定义序列化程序的属性。

(6) 同样适用于 @JsonIdentityInfo;但请注意,使用委托模型处理对象标识可能很棘手。

至于代理人更换...我不担心那个。我认为它是推测性添加的,并没有被框架实际使用。