【问题标题】:To what extend that Object to/from JSON/XML (un)marshaling can break对象到/从 JSON/XML(取消)编组扩展到什么程度可以中断
【发布时间】:2013-04-03 09:14:27
【问题描述】:

我一直在考虑这两个 JSON 库:

  • 谷歌 Gson
  • JSON.Simple
  • XStream

Google Gson 非常棒,它可以序列化具有无参数构造函数的类对象。 JSON.Simple 很简洁,有一个非常简单易用的 API。然而,这些 JSON/Object 映射库可以在多大程度上破坏,即不能再编组对象,无论是在序列化还是反序列化方面。

适用于以下场景:

  • 类的嵌套,即类中的类等
  • 类中类中的非常长的字符串值以及诸如此类的事情
  • 对象的大小,即包含巨大字节的对象

编组无法忍受撞墙的场景有哪些?

我只是在这里大声思考,以了解将这些框架用作我的应用程序的主干时会出现什么问题。以及我们如何预见可能发生的潜在怪癖。

更新:

关于可移植性,我们可以在多大程度上回复(取消)编组,尤其是在处理对象分发时。例如,“序列化”对象通过另一台机器发送,具有不同的 CPU、JVM 等,并且旨在“反序列化”并以某种方式使用。

【问题讨论】:

  • 你也可以看看gensoncode.google.com/p/genson,它好用,提供流式API/数据绑定,即使没有默认ctr也可以反序列化等等

标签: java json marshalling xstream unmarshalling


【解决方案1】:

这里有两个限制:JSON 的限制和编组软件的限制。

第一个很明显:

  • JSON 无法序列化图形。 JSON 中只有“内容”,这意味着无法在 JSON 中创建循环关系。

代码示例:

class Bar { List<Drink> menu = new ArrayList<Drink>(); }
class Drink { List<Bar> servedIn = new ArrayList<Drink>(); }

public void main() {
    Bar b = new Bar();
    Drink whiskey = new Drink();
    b.menu.add(whiskey);
    whiskey.servedIn.add(b);
    serialize(b);
    // a naive serialization will keep serializing
    // a smart serialization will not include the Drink.servedIn field or throw an error
}

第二个限制取决于您的编组软件及其构建方式。简而言之,您将需要两倍的对象图内存:一次用于序列化形式,一次用于非序列化形式。一些解析器更智能,并提供流式传输,从而减少了内存需求。

【讨论】:

  • 换句话说,如果我有一个类 Foo 的字段类型为类 Bar,那么在运行时,我做了: Bar bar = new Bar(); foo.bar = bar 然后假设我们将值放在 bar 对象中,那将不会被序列化。这是你的意思吗?
  • @xybrek - 有支持双向关系的 XML 和 JSON 绑定框架。下面是我们如何在 EclipseLink MOXy 中执行此操作的示例:blog.bdoughan.com/2013/03/…
  • @BlaiseDoughan 感谢您的链接,我不知道!快速说明:这仅适用于可以使用“包含”建模关系的关系。对于无法建立明确的包含树的多对多关系或一对一/一对多关系,这将不起作用。示例:具有“表亲”关系的家谱。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多