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