我正在尝试为jackson中的对象编写自定义序列化,似乎有很多选项,我想知道一个人是否比其他人更受欢迎。
我读过关于JsonSerializableWithType
及其弃用的兄弟JsonSerializable
的文章。这似乎很好,因为它不要求班级用户在他们的Module
中注册ObjectMapper
。但是我似乎无法解决JsonSerializableWithType
或找到其使用的任何示例。谈论它的fastxml页面似乎也过时了。
另一个选项似乎是JsonSerializer
s的外部序列化。我读过有关@JsonSerialize
的内容,但无法判断它是否比JsonSerializable
更好/更差/更旧/更新。
对于其中任何一方而言,是否存在令人信服的论据?或者是以Module
注册ObjectMapper
最常用的方式?
答案 0 :(得分:1)
长话短说:这真的取决于您的个人偏好,以及您是否可以访问价值对象的源代码。
区别在于内置(实现JsonSerializable
)或外部序列化器(注释或模块);以及内部(注释)与外部(模块)关联/注册序列化器。
所以我不会说普遍偏好:每个都有效,受到支持,(在我看来)对某些情况有意义。
一些开发人员更喜欢外部方法,因为它允许值类与Jackson类型没有依赖关系:例如,在实现JsonSerializable
时,您向jackson-databind
添加了一个硬依赖关系。使用@JsonSerialize
注释,您对jackson-annotations
的依赖性较弱,而使用模块方法则根本没有直接依赖。
实现JsonSerializable
有潜在的好处,因为它允许将值类及其处理(包括序列化)的所有细节封装在类定义中。
有些人还会认为这是一个缺点;这取决于你对正确的OOP实践与发展的实用性的看法。
现在:在某些情况下,例如支持第三方库时,您的选择仅限于外部模块或使用混合注释。 对于您自己的价值类型,您可以选择。