Java 从JSON/XML(un)封送可以将该对象扩展到什么程度

Java 从JSON/XML(un)封送可以将该对象扩展到什么程度,java,json,marshalling,xstream,unmarshalling,Java,Json,Marshalling,Xstream,Unmarshalling,我一直在考虑这两个JSON库: 谷歌Gson JSON.Simple XStream GoogleGSON非常棒,它可以序列化没有参数构造函数的类对象。Simple是一个简洁易用的API。然而,这些JSON/对象映射库在多大程度上会中断,即在序列化和反序列化方面无法再封送对象 对于以下场景: 类的嵌套,即类中的类等 类中的类中的非常长的字符串值之类的东西 对象的大小,即包含大字节的对象 在什么样的情况下,编组无法再忍受或撞到墙上 我只是在这里大声思考,以了解在使用这些框架作为我的应用程序的主干时

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

谷歌Gson JSON.Simple XStream GoogleGSON非常棒,它可以序列化没有参数构造函数的类对象。Simple是一个简洁易用的API。然而,这些JSON/对象映射库在多大程度上会中断,即在序列化和反序列化方面无法再封送对象

对于以下场景:

类的嵌套,即类中的类等 类中的类中的非常长的字符串值之类的东西 对象的大小,即包含大字节的对象 在什么样的情况下,编组无法再忍受或撞到墙上

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

更新:


至于可移植性,我们可以在多大程度上回答解组问题,特别是在处理对象分布时。例如,一个序列化的对象通过另一台机器发送,该机器具有不同的CPU、JVM等,并且它打算被反序列化并以某种方式使用

这里有两个限制: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
}

第二个限制取决于您的marhsalling软件及其构造方式。简单地说,您将需要两倍于对象图的内存:一次用于序列化形式,一次用于非序列化形式。一些解析器更智能,并提供流式处理,从而减少内存需求。

因此,换句话说,如果我有一个字段类型为class Bar的a class Foo,那么在运行时,我做到了:Bar Bar=new Bar;foo.bar=bar然后假设我们将值放入bar对象中,该对象将不会序列化。这就是你的意思吗?@xybrek-有支持双向关系的XML和JSON绑定框架。下面是我们在EclipseLink MOXy中的一个例子:@BlaiseDoughan感谢链接,我不知道!简要说明:这只适用于可以使用“包含”对关系进行建模的关系。对于无法建立明确包含树的多对多关系或一对一/一对多关系,这将不起作用。示例:具有“表亲”关系的族谱。您还可以查看genson,它易于使用,提供流式api/数据绑定,即使没有默认ctr,也可以反序列化等等