1

我有一个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 给我无类名的输出,但是对于如何实现这一点我很迷茫。

4

2 回答 2

-1

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

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

  • '1_1':一个

或规范地

  • !!str "1_1": !!str "一"

否则在解析文档时,它将创建 Map< Integer , String> 而不是 Map< String , String>

JYaml 有许多未解决的问题并且没有实现完整的 YAML 1.1

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

于 2009-02-10T21:22:58.163 回答
-2

检查 SnakeYAML 最新源。现在可以(与 JYaml 中相同)忽略隐式类型并始终将标量解析为字符串。这快了几倍。查看此处此处以了解如何使用新功能。

(在关闭正则表达式的情况下,序列化/反序列化时间随着正在处理的数据量线性增加。)

于 2009-02-19T16:24:39.983 回答