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

时间:2015-04-12 11:03:59

标签: jackson

使用Jackson 2.5+时,JsonSerializer方法必须通过返回的包裹JsonSerializer覆盖:

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

我绝对会覆盖serialize(...),因为我会根据其覆盖中属性的值过滤掉某些对象的序列化。否则,如果对象未被其属性值过滤掉,我通过调用js.serialize(...)来正常序列化,其中js是作为参数传递给JsonSerializer的{​​{1}} modifySerializer 1}}。

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

  1. getDelegatee()
  2. replaceDelegatee(...)
  3. isUnwrappingSerializer()
  4. unwrappingSerializer(...)
  5. handledType()
  6. usesObjectId()
  7. isEmpty(T)
  8. isEmpty(SerializerProvider, T)
  9. acceptJsonFormatVisitor(...)
  10. serializeWithType(...)
  11. 例如,getDelegatee()应该返回js吗?

    为什么我要允许replaceDelegatee(...)替换js作为代理人?如果我应该允许这样做,那么我必须将js保存到字段中,以便我可以替换它。

1 个答案:

答案 0 :(得分:1)

根据我的另一个答案,你确实想要(重新)定义一些,而不是其他。 (1),(8),(9)和(10)确实有意义; (7)已弃用,不再需要。 (5)应该由基类定义(至少如果扩展StdSerailizer),如果没有定义,应该主要定义,因为它被一些错误报告使用。

(3)和(4)是您可能希望支持的内容,如果您希望为该类型实现@JsonUnwrapped。如果您委托标准POJO序列化器,这可能是真的。如果未实现,@JsonUnwrapped对自定义序列化程序的属性基本不起作用。

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

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