yamlbeans:为什么需要 String 类型的标量?
yamlbeans: why is a scalar for String type expected?
简介
我正在尝试使用 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
的引用指的是我上面粘贴的反序列化行。
Class 定义
这是我对 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"]
部分。我真正想知道的是,当我说 labels
是 List<String>
时,为什么 YamlReader
会期待 String
(因此应该表示为一个序列在文件中)?
问题
为什么 YamlReader
需要字符串而不是 List<String>
?
我希望我的问题不是 yamlbeans 项目特有的。在我看来,这只是我的 YAML 语法与我的 class 定义相关的一个错误。
YamlBeans 1.09 似乎没有处理 YAML 1.2 规范中的所有功能,这可能是这里出现问题的原因。
我已经切换到 SnakeYaml 库并发现它在许多方面都有重大改进,并且它可以正确反序列化文档。
简介
我正在尝试使用 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
的引用指的是我上面粘贴的反序列化行。
Class 定义
这是我对 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"]
部分。我真正想知道的是,当我说 labels
是 List<String>
时,为什么 YamlReader
会期待 String
(因此应该表示为一个序列在文件中)?
问题
为什么 YamlReader
需要字符串而不是 List<String>
?
我希望我的问题不是 yamlbeans 项目特有的。在我看来,这只是我的 YAML 语法与我的 class 定义相关的一个错误。
YamlBeans 1.09 似乎没有处理 YAML 1.2 规范中的所有功能,这可能是这里出现问题的原因。
我已经切换到 SnakeYaml 库并发现它在许多方面都有重大改进,并且它可以正确反序列化文档。