杰克逊序列化应该忽略已包含的对象

时间:2011-12-02 05:01:38

标签: jackson

因此,对于常见问题,这似乎是一个相当简单的答案:在Jackosn中检测到无限循环。如果,当序列化一个对象树时,杰克逊遇到了一个已经序列化的对象为什么它不会忽略它呢?有没有办法在杰克逊这样做,或者有人创造了类似的东西?

为什么所有这些都在使用JsonManagedReference / JsonBackReference,如果你在某些时候开始序列化子对象(需要引用父对象)并且你在某些时候序列化父对象(这显然不是不希望孩子重新回到自己身边)?

现在看来我必须创建自定义视图,其中考虑到每种类型的循环引用和用例,这在任何非平凡的ORM中都是一项艰巨的任务。

1 个答案:

答案 0 :(得分:0)

编辑(2012年10月)

杰克逊2.x现在实际上支持使用@JsonIdentityInfo注释处理身份信息!所以最初的答案有点过时了......


<强>过时

杰克逊不支持处理对象标识:这不是一项非常重要的任务,因为识别共享对象可以通过遍历对象图来完成(产生一些开销),而是确定如何包含身份信息;哪些有用以及如何使用。这反过来有点类似于包含类型信息,但现在增加了额外包装的第二维处理。 之前已经要求这样做,并且已经考虑了如何去做,但是努力与受益的比率(即请求的数量,需要的程度)已经高于添加其他功能。

所以你最好的选择是使用包装器对象并手动实现,或者看看XStream可以解决这个问题(启用时;它会增加大量的时间开销),并且还使用Jettison进行JSON输出模式。

为您的用例手动实现这一点比解决一般情况要容易一些:您可以从BeanSerializerModifier开始添加可以跟踪对象标识的包装处理程序,并知道要将序列化作为对象标识。