【问题标题】:StackOverflowError when trying to serialize from Idml to Json with Jackson尝试使用 Jackson 将 Idml 序列化为 Json 时出现 StackOverflowError
【发布时间】:2012-10-02 12:37:13
【问题描述】:

一直在使用 IDMLlib 将 IDML 文件加载到 POJO,但是当我尝试使用 Jackson JSON 将生成的 java 对象序列化为 JSON 时,我一直遇到无限递归的麻烦。

Caused by JsonMappingException: Infinite recursion (StackOverflowError)
(through reference chain: 
de.fhcon.idmllib.api.elements.preferences.Preferences["layoutAdjustmentPreference"]
->de.fhcon.idmllib.api.elements.preferences.LayoutAdjustmentPreference["parent"]
... etc

->>  539 | serializeFields in com.fasterxml.jackson.databind.ser.std.BeanSerializerBase

在解析过程中多次发生这种情况。
Idml.document -> Document.root -> Idml.document -> Document.root 是类似的。

我正在使用 Jackson 的 ObjectMapper 将 POJO 转换为 JSON:

Idml idml = new Idml("test.idml");
ObjectMapper mapper = new ObjectMapper();
String JSONstring = mapper.writeValueAsString(idml);

IDMLlib 类已编译,因此我无法对它们进行任何更改。
任何人都知道我仍然可以使用 IDMLlib 返回的 java 对象而无需创建自己的方法吗?

编辑:
似乎在整个过程中都提到了“根”和“父”。所以基本上我要问的是是否有人知道如何能够在不修改对象的情况下序列化它

【问题讨论】:

  • 重试,得到了前面提到的document->root问题。但是,主要问题仍然相同。失败:com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)(通过引用链:de.fhcon.idmllib.api.elements.Document["root"]->de.fhcon.idmllib.api.elements。 idml["document"]-> de.fhcon.idmllib.api.elements.Document["root"]->...等
  • 自始至终似乎都提到了“root”和“parent”。所以基本上我要问的是是否有人知道如何能够在不修改对象的情况下序列化它。

标签: java json jackson idml


【解决方案1】:

当由于某些原因无法访问对象的某个属性或无法序列化对象的某个属性时,Jackson 倾向于抛出这种异常。

如果您没有在要序列化的对象上指定任何注释,Jackson 会尝试通过深入递归来序列化所有内容。

难道你不能告诉杰克逊忽略某些属性或字段吗?

我有过使用 Hibernate 初始化 Pojo 的经验,我应该将“@JacksonIgnore”添加到我使用 Hibernate 延迟加载的每个属性中。

【讨论】:

  • 我无法编辑任何 IDMLlib 域类,因为它们是第三方产品。那是我的问题。
【解决方案2】:

如果引用是简单的父/子类型的东西(听起来很像),只需使用注释:

// on parent object
@JsonManagedReference
public ChildOb child;

// on child object
@JsonBackReference ParentOb parent;

Jackson 会将事情序列化,以便只写出“孩子”(不写出父母);并且在反序列化时,它会重新链接事物。

【讨论】:

  • 不一定,如果你使用“mix-in annotations”;因此您可以将其包含在其中,也可以使用 mix-ins。
  • 试过了,但无法完全弄清楚混音。 IDMLlib返回的对象包含更多的对象,其中包含更多的对象等等,所有这些都被编译。总共大约有3-400个。即使我的任务需要减少到大约 50-100 个,我是否必须为每个班级创建一个 Mix-in?
  • 是的。您可以将它们应用于超类(注释是继承的),这会有所帮助。或者,如果您已经有了某些方面(注解,或其他任何特定于字段/方法的内容),您可以将AnnotationIntrospector 子类化以使用非杰克逊注解。
  • 主要问题是我对 Jackson 和 Json 很陌生。目前制作了大量的混音,但无论如何这似乎都不是最理想的方式。
  • 顺便说一句,感谢所有反馈!
猜你喜欢
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多