2016-02-29 3 views
0

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

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; } 
    } 

Но она по-прежнему не работает.

+0

Кажется, работает для меня ... Я подозреваю, что это может быть потому, что вы никогда не уничтожаете StreamWriter, поэтому он никогда не краснеет. –

ответ

0

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

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

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