yamlbeans:为什么期望String类型的标量?

时间:2016-08-06 20:21:21

标签: java deserialization yaml yamlbeans

简介

我尝试使用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"]部分。我真正想知道的是,当我说YamlReaderString时,labels为什么会期待List<String>(因此应该表示为文件中的一个序列)?

问题

YamlReader期望字符串而不是List<String>的原因是什么?

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

1 个答案:

答案 0 :(得分:0)

似乎YamlBeans 1.09无法处理YAML 1.2规范中的所有功能,这可能是此问题的原因。

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