Настроить сериализацию словаря в Yaml

Я ищу чистый метод настройки вывода сериализатора YamlDotNet.

У меня есть следующий POCO:

public class MyClass{
  public string Foo { get;set; }
  public Dictionary<string, string> Bar { get;set; }
}

Если я установлю на нем значения, например

var class = new MyClass{ Foo = "bla" };
class.Bar["key1"] = "val1";
class.Bar["key2"] = "val2";

и сериализовать это, тогда я получу результаты:

Foo: bla
Bar:
  key1: val1
  key2: val2

Однако то, что мне нужно получить, это

Foo: bla
key1: val1
key2: val2

Я не могу добавить key1, key2 и т. д. в качестве свойств MyClass, поскольку они неизвестны до времени выполнения (как значение, так и количество ключей). Есть ли способ сделать это с помощью YamlDotNet?

Я рассматривал возможность использования отражения для преобразования всего в MyClass в Dictionary<string, object>, но предпочел бы более чистую реализацию.

Есть ли способ, которым я могу контролировать сериализацию до такой степени?


person Fermin    schedule 29.06.2016    source источник
comment
В вашем желаемом решении, как десериализатор узнает, где десериализовать key1: val1?   -  person lokusking    schedule 29.06.2016
comment
@lokusking - меня беспокоит только сериализация для этого. Это для генерации RAML, поэтому он только выводит данные, а не потребляет их.   -  person Fermin    schedule 29.06.2016


Ответы (1)


Простое решение — реализовать IDictionary<string, string> в MyClass. Единственными элементами, которые действительно необходимо реализовать, является перечислитель. Там вы бы вернули содержимое словаря, а также еще одну запись для каждого дополнительного свойства.

Если вы предпочитаете, чтобы ваш POCO оставался чистым, вы можете создать класс, который реализует IYamlTypeConverter. У меня нет под рукой ПК, чтобы реализовать это для вас, но вы можете использовать этот код в качестве примера:

https://dotnetfiddle.net/1plIcc

(К сожалению, копирование кода здесь не работает на смартфоне. Я добавлю код, когда у меня будет доступ к соответствующему ПК)

person Antoine Aubry    schedule 29.06.2016
comment
Спасибо, Антуан. Я заставил его работать с подходом IDictionary‹›, но попытался реализовать IYamlConverter и повторить там словарь, но он все равно каждый раз выдавал ключ «Bar» (если я что-то не упустил!) - person Fermin; 30.06.2016