单向IE可数处理

时间:2019-02-14 07:57:58

标签: serialization yaml yamldotnet

我有大量资源(有些IEnumerable逐行通过IDbReader),我需要序列化为yaml并反序列化。
如何避免收集所有项目在内存中?

1 个答案:

答案 0 :(得分:0)

您应该能够直接使用Serializer来序列化IEnumerable。请确保在序列化器上禁用别名,并且别名应以流方式进行序列化,而无需先加载整个源:

var serializer = new SerializerBuilder()
    .DisableAliases()
    .Build();

您可以在下面的代码中看到此操作。它将序列化前100个项目,然后失败,但出现异常,但是您可以看到第一个项目已被序列化:

using System;
using YamlDotNet.Serialization;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var source = Enumerable.Range(1, 10000).Select(i => {

            if(i == 100) throw new Exception("I'm done");

            return new {
                Index = i,
                Title = "Item " + i
            };
        });

        var serializer = new SerializerBuilder()
            .DisableAliases()
            .Build();

        serializer.Serialize(Console.Out, source);
    }
}

看到它在这里运行:https://dotnetfiddle.net/Rk1nrx