JYaml:转储对象,不包括类名

时间:2009-02-10 11:23:35

标签: java yaml jyaml

我有一个ArrayList个对象被转储到YAML字符串,并且在处理这个对象时一直在比较JYaml和SnakeYaml的性能。

    ArrayList<HashMap> testList = new ArrayList<HashMap>();
    HashMap<String, String> testMap1 = new HashMap<String, String>();
    HashMap<String, String> testMap2 = new HashMap<String, String>();

    testMap1.put("1_1", "One");
    testMap1.put("1_2", "Two");
    testMap1.put("1_3", "Three");

    testMap2.put("2_1", "One");
    testMap2.put("2_2", "Two");
    testMap2.put("2_3", "Three");

    testList.add(testMap1);
    testList.add(testMap2);

    System.out.println(jYaml.dump(testList));
    System.out.println(snakeYaml.dump(testList));


JYaml的输出包括序列化对象的类名,而SnakeYaml的输出则不包括:

JYaml输出:

- !java.util.HashMap
  1_1: One
  1_3: Three
  1_2: Two
- !java.util.HashMap
  2_1: One
  2_2: Two
  2_3: Three

SnakeYaml输出:

- {'1_1': One, '1_3': Three, '1_2': Two}
- {'2_1': One, '2_2': Two, '2_3': Three}


我更喜欢SnakeYaml的“干净”类无名称输出,因为这更适合于语言中立的环境。

我更喜欢JYaml的速度。序列化/反序列化时间随着处理的数据量的增加线性,与使用SnakeYaml的指数相反。

我想强迫JYaml给我一个无名字输出,但是我很想知道如何实现这一目标。

2 个答案:

答案 0 :(得分:-1)

你如何衡量速度?你是什​​么意思'数据量'?它是YAML文档的大小还是一定数量的文档?

JYaml输出不正确。根据规范,下划线中的数字被忽略,1_1 = 11(至少对于YAML 1.1)。因为它实际上是一个String而不是一个Integer,所以表示应该是:

  • '1_1':一个

或规范

  • !! str“1_1”:!! str“One”

否则,当解析文档时,它将创建Map&lt; Integer ,String&gt;而不是Map&lt; String ,String&gt;

JYaml存在许多未解决的问题,并未实现完整的YAML 1.1

JYaml确实可能更快,但这是由于简化的解析和发射。

答案 1 :(得分:-1)

检查SnakeYAML最新来源。 It is now possible(与JYaml中相同)忽略隐式类型并始终将标量解析为字符串。这快几倍。 查看herehere,了解如何使用新功能。

(使用RegularExpressions关闭序列化/反序列化时间随着处理的数据量线性增加。)