我正在尝试为杰克逊中的对象编写自定义序列化,而且似乎有很多选择,我想知道一个通常是否比另一个更受欢迎。
我已经读过关于JsonSerializableWithType
及其不推荐使用的同级JsonSerializable
。这似乎很好,因为它不需要类的用户在其Module
中注册ObjectMapper
。但是我似乎无法解析JsonSerializableWithType
或找到其用法的任何示例。讨论它的fastxml页面似乎也过时了。
另一个选择似乎是使用JsonSerializer
进行外部序列化。我已经读过有关@JsonSerialize
的内容,但无法判断它是否比JsonSerializable
更好/更差/更旧/更新。
是否有一个令人信服的论点,其中一个优于另一个?还是将Module
注册到ObjectMapper
的方式是最可接受的?
最佳答案
长话短说:这实际上取决于您的个人喜好以及是否可以访问有价对象的源代码。
差异是内置的(实现JsonSerializable
)或外部的串行器(注释或模块)之间的差异。以及序列化程序的内部(注释)与外部(模块)关联/注册。
因此,我不会说存在普遍的偏爱:每一种方法都可以得到支持,并且(在我看来)在某些情况下是有意义的。
一些开发人员更喜欢外部方法,因为它允许值类不依赖于Jackson类型:例如,在实现JsonSerializable
时,您为jackson-databind
添加了硬性依赖。使用@JsonSerialize
批注,您对jackson-annotations
的依赖性较弱,而使用模块方法时,根本没有直接的依赖性。
实现JsonSerializable
有潜在的好处,因为它允许将值类的所有详细信息及其处理(包括序列化)封装在类定义中。
有些人也会认为这是不利的。这取决于您对正确的OOP做法与开发实用性的看法。
现在:在某些情况下,例如在支持第三方库时,您的选择仅限于外部模块或使用混合注释。
对于您自己的值类型,您可以选择。