1

介绍

我正在尝试使用yamlbeans (v1.0) 将 YAML 文档的内容反序列化为 Java 对象。这是我试图反序列化的 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"]是文件的一部分。我真正想知道的是,当我说它是 a时,为什么会YamlReader期待 a (因此应该在文档中表示为一个序列)?StringlabelsList<String>

问题

出于什么原因会YamlReader期望一个字符串而不是一个List<String>

我希望我的问题不是特定于 yamlbeans 项目。在我看来,这只是我的 YAML 语法与我的类定义相关的错误。

4

1 回答 1

0

YamlBeans 1.09 似乎没有处理 YAML 1.2 规范中的所有功能,这可能是这里出现问题的原因。

从那以后,我切换到 SnakeYaml 库,发现它在许多方面都有重大改进,并且它可以正确地反序列化文档。

于 2016-09-14T19:50:16.437 回答