YamlDotNet 库是否支持文档分隔符?
本文关键字:分隔符 文档 支持 是否 YamlDotNet | 更新日期: 2023-09-27 18:34:14
这个YAML
文件:
---
- Prisoner
- Goblet
- Phoenix
---
- Memoirs
- Snow
- Ghost
正在通过以下代码反序列化:
var input = new StreamReader (path)
var deserializer = new Deserializer();
var lis = deserializer.Deserialize <List <string>> (input);
结果是YamlDotNet.dll
中的异常:
(Line: 5, Col: 4, Idx: 136): Expected 'StreamEnd',
got 'DocumentStart' (at Line: 5, Col: 1, Idx: 133).
更新1:SharpYaml:相同的异常
更新2:@DarrelMiller:是的,从我的第一个示例中不清楚,但是在第二个示例中可以看到文档分隔符的需求:
---
- Prisoner
- Goblet
- Phoenix
---
- Memoirs: [213, 2004]
- Snow: [521, 2011]
- Ghost: [211, 2002]
所以我需要分隔符来更改Deserializer
的类型。
@AntoineAubry:谢谢你的回答和YamlDotNet,我都喜欢。
您可以轻松地反序列化多个文档。为此,您需要使用采用 EventReader 的 Deserialize() 重载:
public void Main()
{
var input = new StringReader(Document);
var deserializer = new Deserializer();
var reader = new Parser(input);
// Consume the stream start event "manually"
reader.Consume<StreamStart>();
// Deserialize the first document
var firstSet = deserializer.Deserialize<List<string>>(reader);
Console.WriteLine("## First document");
foreach(var item in firstSet)
{
Console.WriteLine(item);
}
// Deserialize the second document
var secondSet = deserializer.Deserialize<List<string>>(reader);
Console.WriteLine("## Second document");
foreach(var item in secondSet)
{
Console.WriteLine(item);
}
}
这是一个完全有效的例子。
您甚至可以使用循环阅读任意数量的文档:
while(reader.Accept<DocumentStart>())
{
// Deserialize the document
var doc = deserializer.Deserialize<List<string>>(reader);
Console.WriteLine("## Document");
foreach(var item in doc)
{
Console.WriteLine(item);
}
}
工作示例