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 и обнаружил, что она во многом значительно улучшилась, и она правильно десериализует документ.

Другие вопросы по тегам