将对象扩展到JSON / XML(un)编组的范围可以打破

时间:2013-04-03 09:14:27

标签: java json marshalling xstream unmarshalling

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

  • Google Gson
  • JS​​ON.Simple
  • XStream的

Google Gson非常棒,它可以序列化具有no-args构造函数的类对象。 JSON.Simple是一个非常简单易用的API。但是,在序列化和反序列化方面,这些JSON / Object映射库可以在多大程度上破坏,即无法再编组对象。

对于以下情况:

  • 类的嵌套,即类内的类等,
  • 类中的类和那些类中的非常长的字符串值
  • 对象的大小,即包含大字节的对象

哪些情况下编组无法再将其敲打墙

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

更新

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

1 个答案:

答案 0 :(得分:0)

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

第一个是显而易见的:

  • JSON无法序列化图表。 JSON中只有'content',这意味着无法在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软件及其构建方式。简单地说,你需要两倍于对象图的内存:一次用于序列化表单,一次用于反序列化表单。有些解析器更智能,并提供流式传输以减少内存需求。