2015-04-12 42 views
0

使用傑克遜2.5+,什麼JsonSerializer方法必須由一個包裹JsonSerializer覆蓋從返回:Jackson 2.5+:必須通過包裝從BeanSerializerModifier.modifySerializer(...)返回的JsonSerializer重寫什麼JsonSerializer方法?

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

我肯定重寫serialize(...),因爲我是從基於的值被序列化過濾掉一些對象他們的屬性在那個覆蓋。否則,如果對象沒有被其屬性值過濾掉,我通常通過調用js.serialize(...)來序列化,其中js是作爲參數傳遞給modifySerializerJsonSerializer

但我不知道我是否還應該覆蓋以下任何其他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()回報js

爲什麼我要讓replaceDelegatee(...)代替js作爲代表?如果我允許這樣做,那麼我必須將js保存到一個字段中,以便我可以替換它。

回答

1

根據我的其他答案,其中一些你確實想要(重新)定義,而另一些則不是。 (1),(8),(9)和(10)確實有意義; (7)已被棄用且不再需要。 (5)應該由基類定義(至少如果擴展StdSerailizer),如果沒有定義,應該主要定義它,因爲它被某些錯誤報告使用。

(3)和(4)是您可能想要支持的事情,如果您想爲該類型實施@JsonUnwrapped。如果你委託給一個標準的POJO序列化器,這可能是真的。如果沒有實現,@JsonUnwrapped基本上不會影響您的自定義序列化器的屬性。

(6)同樣適用於@JsonIdentityInfo;但請注意,使用委託模型處理對象標識可能會很棘手。

至於受委代表替換...我不會擔心那個。我認爲它是推測性的,並沒有被框架實際使用。

相關問題