我正在尝试为杰克逊中的对象编写自定义序列化,而且似乎有很多选择,我想知道一个通​​常是否比另一个更受欢迎。

我已经读过关于JsonSerializableWithType及其不推荐使用的同级JsonSerializable。这似乎很好,因为它不需要类的用户在其Module中注册ObjectMapper。但是我似乎无法解析JsonSerializableWithType或找到其用法的任何示例。讨论它的fastxml页面似乎也过时了。

另一个选择似乎是使用JsonSerializer进行外部序列化。我已经读过有关@JsonSerialize的内容,但无法判断它是否比JsonSerializable更好/更差/更旧/更新。

是否有一个令人信服的论点,其中一个优于另一个?还是将Module注册到ObjectMapper的方式是最可接受的?

最佳答案

长话短说:这实际上取决于您的个人喜好以及是否可以访问有价对象的源代码。

差异是内置的(实现JsonSerializable)或外部的串行器(注释或模块)之间的差异。以及序列化程序的内部(注释)与外部(模块)关联/注册。

因此,我不会说存在普遍的偏爱:每一种方法都可以得到支持,并且(在我看来)在某些情况下是有意义的。

一些开发人员更喜欢外部方法,因为它允许值类不依赖于Jackson类型:例如,在实现JsonSerializable时,您为jackson-databind添加了硬性依赖。使用@JsonSerialize批注,您对jackson-annotations的依赖性较弱,而使用模块方法时,根本没有直接的依赖性。

实现JsonSerializable有潜在的好处,因为它允许将值类的所有详细信息及其处理(包括序列化)封装在类定义中。
有些人也会认为这是不利的。这取决于您对正确的OOP做法与开发实用性的看法。

现在:在某些情况下,例如在支持第三方库时,您的选择仅限于外部模块或使用混合注释。
对于您自己的值类型,您可以选择。

10-06 01:01