Невозможно сериализовать KeyValuePair с YamlDotNet

Я пишу простой класс, который сериализует мой IConfiguration интерфейс, который имеет следующий метод

IEnumerable<KeyValuePair<string, object>> GetAllProperties();

В моем классе у меня есть метод

    public void WriteConfiguration(IConfiguration data, Stream stream)
    {
         new Serializer().Serialize(new StreamWriter(stream), data.GetAllProperties());
    }

Но Serializer ничего не пишет в поток. Где-то я это читал KeyValuePair не сериализуем, но сейчас это не так (это было в.NET 2.0)

Я попытался сначала преобразовать IEnumerable к List (с помощью .ToList()), но ничего не изменилось. Затем я попытался создать класс для использования вместо KeyValuePair:

    [Serializable]
    private class Pair<TKey, TValue>
    {
        public Pair() { }

        public Pair(TKey key, TValue value)
        {
            Key = key;
            Value = value;
        }

        public TKey Key { get; set; }
        public TValue Value { get; set; }
    }

Но это все еще не работает.

1 ответ

Решение

Это потому, что вы не избавляетесь от StreamWriter, поэтому он не сбрасывается в поток. Попробуйте положить его в using блок:

public void WriteConfiguration(IConfiguration data, Stream stream)
{
     using (var writer = new StreamWriter(stream))
     {
         new Serializer().Serialize(writer, data.GetAllProperties());
     }
}

Примечание: по умолчанию StreamWriter также закроет основной поток. Если вы хотите оставить его открытым, используйте StreamWriter перегрузка конструктора, которая принимает leaveOpen параметр, и передайте true для этого параметра.

Другие вопросы по тегам