yamlbeans: почему ожидается скаляр для типа String?
Вступление
Я пытаюсь десериализовать содержимое документа YAML в объект Java с помощью yamlbeans (v1.0). Вот документ YAML, который я пытаюсь десериализовать (topologyGrammar.yml
):
---
rules:
- !tp.aoi.topology.TopologyRule { labels: ["empty_A"], output: ["entry_B"] }
Вот как я делаю попытку десериализации:
mainTG = (TopologyGrammar) loadYAML(TopologyGrammar.class, "grammars/topologyGrammar.yml");
где loadYAML
выглядит следующим образом:
public Object loadYAML(Class<?> daClass, String URL) throws YamlException {
FileHandle handle = Gdx.files.internal(URL);
YamlConfig config = new YamlConfig();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
config.readConfig.setClassLoader(classLoader);
YamlReader reader = new YamlReader(handle.reader(), config);
return reader.read(daClass);
}
У этого метода не было проблем с загрузкой других файлов YAML, которые я пробовал. В верхней части трассировки стека я получаю следующее:
net.sourceforge.yamlbeans.YamlReader$YamlReaderException: Line 8, column 7: Expected scalar for String type but found: sequence start
at net.sourceforge.yamlbeans.YamlReader.readValueInternal(YamlReader.java:175)
at net.sourceforge.yamlbeans.YamlReader.readValue(YamlReader.java:150)
at net.sourceforge.yamlbeans.YamlReader.readValueInternal(YamlReader.java:261)
at net.sourceforge.yamlbeans.YamlReader.readValue(YamlReader.java:150)
at net.sourceforge.yamlbeans.YamlReader.readValueInternal(YamlReader.java:298)
at net.sourceforge.yamlbeans.YamlReader.readValue(YamlReader.java:150)
at net.sourceforge.yamlbeans.YamlReader.readValueInternal(YamlReader.java:261)
at net.sourceforge.yamlbeans.YamlReader.readValue(YamlReader.java:150)
at net.sourceforge.yamlbeans.YamlReader.read(YamlReader.java:106)
at net.sourceforge.yamlbeans.YamlReader.read(YamlReader.java:91)
at tp.aoi.grammars.YAMLparser.loadYAML(YAMLparser.java:69)
at tp.aoi.grammars.YAMLparser.<init>(YAMLparser.java:43)
...
Ссылка на YAMLparser.java:43
относится к линии десериализации, которую я вставил выше.
Определения классов
Вот мое определение для TopologyGrammar.java
:
public class TopologyGrammar {
public List<TopologyRule> rules;
}
И мое определение для TopologyRule.java
:
public class TopologyRule {
public List<String> labels;
public List<String> output;
}
Дополнительные мысли
Мне кажется, что Expected scalar for String type but found: sequence start
имеет в виду labels: ["empty_A"]
часть документа. Что меня действительно интересует, так это почему YamlReader
ожидать String
во всяком случае, когда я говорю, что labels
это List<String>
(и поэтому должны быть представлены в виде последовательности в документе)?
Вопрос
По какой причине YamlReader
ожидать строку, а не List<String>
?
Я надеюсь, что моя проблема не относится к проекту yamlbeans. Мне кажется, что это просто ошибка в том, как мой синтаксис YAML соотносится с определениями моего класса.
1 ответ
Похоже, что YamlBeans 1.09 не обрабатывает все функции в спецификации YAML 1.2, и это может быть причиной проблемы здесь.
С тех пор я переключился на библиотеку SnakeYaml и обнаружил, что она во многом значительно улучшилась, и она правильно десериализует документ.