Ямл:дамп объекта без включения имени класса

StackOverflow https://stackoverflow.com/questions/531920

  •  22-08-2019
  •  | 
  •  

Вопрос

у меня есть 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.Время сериализации/десериализации увеличивается. линейно с объемом обрабатываемых данных, в отличие от экспоненциально со СнейкЯмлом.

Я хотел бы заставить JYaml выдавать мне вывод без имени класса, но совершенно не понимаю, как этого можно достичь.

Это было полезно?

Решение

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

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

Другие советы

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

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

  • '1_1':Один

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

  • !!стр "1_1":!!str "Один"

В противном случае при анализе документа будет создан Map<Целое число, String> вместо Map<Нить, Строка>

В JYaml много открытых проблем, и он не реализует полную версию YAML 1.1.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top