JYaml: объект дампа без включения имени класса - PullRequest
1 голос
/ 10 февраля 2009

У меня есть 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 голосов
/ 19 февраля 2009

Проверьте последний источник SnakeYAML. Теперь возможно (так же, как в JYaml) игнорировать неявную типизацию и всегда анализировать скаляры как строки. Это в несколько раз быстрее. Посмотрите здесь и здесь , чтобы узнать, как использовать новую функцию.

(При отключенных регулярных выражениях время сериализации / десериализации линейно увеличивается с количеством обрабатываемых данных.)

0 голосов
/ 11 февраля 2009

Как вы измеряете скорость? Что вы имеете в виду под «количеством данных»? Это размер документа YAML или количество документов?

Вывод JYaml неверен . Согласно спецификации подчеркивания в числах игнорируются и 1_1 = 11 (по крайней мере, для YAML 1.1). Поскольку это на самом деле строка, а не целое число, представление должно быть:

  • '1_1': один

или канонически

  • !! str "1_1": !! str "One"

В противном случае, когда документ анализируется, он создает карту <<strong> целое число , строка> вместо карты <<strong> строка , строка>

JYaml имеет много открытых проблем и не реализует полный YAML 1.1

JYaml действительно может быть быстрее, но это из-за упрощенного анализа и генерации.

...