当前位置: 首页 > 面试题库 >

如何使用杰克逊序列化瞬态字段?

傅经业
2023-03-14
问题内容

我们将JSON序列化与Jackson结合使用,以公开系统的内部状态以调试属性。

默认情况下,杰克逊不会序列化瞬态字段-但我也希望对其进行序列化。如何序列化这些字段?

我知道的一种方法是为这些字段提供getter-但我不想这样做,因为我有一些我不想被调用的getX方法(例如,有些getter会更改对象状态)。

我知道我可以创建一个注释,但是我真的想避免使用它。

所以我的问题是:有没有一种方法可以设置杰克逊来序列化 所有 对象字段?包括瞬态的。


问题答案:

我不认为Jackson支持任何类型的配置以使其能够序列化瞬态字段。添加该功能存在一个未解决的问题,但是它很旧并且没有得到解决(据我所知):http
:
//jira.codehaus.org/browse/JACKSON-623

所以我的问题是:有没有一种方法可以设置杰克逊来序列化所有对象字段?包括瞬态的。

因此,回答您的问题,不。

其他一些Java JSON工具(例如GSON) 也支持
配置选项以序列化瞬态字段。如果可以使用其他工具,则可以进行研究(有关GSON,请参阅:https : //sites.google.com/site/gson/gson-user-
guide)。

要扩展一点,您可以尝试其他方法。

首先,您不应该尝试序列化瞬态字段。毕竟,瞬态的定义是“不要序列化它”。不过,我可以想到一些可能需要或至少很方便的特定情况(例如,使用无法修改的代码时)。不过,在99%的情况下,答案是不要这样做。更改该字段,以便在需要序列化时不会瞬变。如果您在多个上下文中使用同一字段,并且希望在一个字段(例如JSON)中序列化而不在另一个字段(例如,java.io)中序列化,则应针对以下情况创建自定义序列化器:您不需要它,而不是滥用关键字。

其次,关于使用吸气剂并使用“某些吸气剂会改变对象的状态”,您也应尽量避免这种情况。这会导致各种意想不到的后果。而且,从技术上讲,这不是吸气剂,而是设置器。我的意思是,如果它使状态发生突变,那么即使您按照“
get”约定命名它并返回一些东西,您也将拥有一个变子(setter)而不是访问器(getter)。



 类似资料:
  • 问题内容: 我有以下课程- 我正在使用objectMapper.valueToTree(sections)将其转换为JsonNode。但是,当我打印相同的内容时,我仅从Entity类中看到id和name字段,而从Images列表中看不到任何内容。我是否需要添加任何种类的特殊逻辑或注释以确保同时打印列表。 以下是主要课程- 问题答案: 您需要为Entity#images添加getter和setter

  • 我尝试序列化Jackson属性类型信息,即使我的类型被映射引用。 使用此简单示例: 我得到: 但我想有: 可能吗?怎么做? 我已经尝试使用,但我得到:

  • 有没有办法让Jackson序列化某个流对象(并在之后关闭)?这样地: 使现代化 澄清:我想流式传输内容,而不仅仅是将其序列化到单个String对象。

  • 问题内容: 我想要的示例代码: 问题答案: 使用Jackson Kotlin Module 当前版本,如果您导入完整的模块包或特定的扩展功能,则将提供所有扩展方法。如: 因此,用于Kotlin的Jackson模块将推断出正确的类型,并且您不需要实例。 因此,您的情况(稍微重命名并修复了数据类和JSON): 您也可以使用以下形式: 如果没有导入,则会出现错误,因为找不到扩展功能。

  • 这是密码 输出量 我的问题是: 为什么jackson在完成构建后修改了没有setter的私有final字段?如果这是有意的,我该如何关闭它 非常感谢。

  • 我试图让下面的例子工作: 然而,它失败了 从这个答案中,我尝试了类似这样的做法: 但这失败了: 由于我正在处理的项目的限制,我无法修改对象映射器。所以我不能简单地做: 这本来是可行的。 还有其他简单的方法可以让ImmutableList反序列化工作吗? 编辑:我设法得到了一个不同的错误,如下所示: 这引发了: 如果我可以为ImmutableListDeserializer或类似的东西构建一个无参数