2

この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).

Update1: SharpYaml: 同じ例外

Update2: @DarrelMiller: はい、最初の例からは明らかではありませんが、ドキュメントセパレーターの必要性は2番目の例で見られます:

---
- Prisoner
- Goblet
- Phoenix
---
- Memoirs: [213, 2004]
- Snow: [521, 2011] 
- Ghost: [211, 2002]

そのため、のタイプを変更するにはセパレーターが必要でしたDeserializer

@AntoineAubry: 回答と YamlDotNet に感謝します。どちらも気に入っています。

4

1 に答える 1

1

複数のドキュメントを簡単に逆シリアル化できます。これを行うには、 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);
    }
}

実施例

于 2014-12-15T23:45:44.230 に答える