односторонняя обработка - PullRequest
0 голосов
/ 14 февраля 2019

У меня огромный источник (около IEnumerable, который проходит через IDbReader строка за строкой), который мне нужно сериализовать для yaml и десериализации обратно.
Как можно избежать сбора всех элементов в памяти?

1 Ответ

0 голосов
/ 14 февраля 2019

Вы должны иметь возможность использовать Сериализатор напрямую для сериализации 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

...