2016-11-23 6 views
1

Давайте предположим, что мы имеем:Сериализация список <KeyValuePair <строка, объект >>

public List<KeyValuePair<string, object>> Items { get; set; } 

Как мы можем сериализовать его следующим образом:

<!--<SomeEnclosingElement>--> 
    <Key1>Value1.ToString()</Key1> 
    <Key2>Value2.ToString()</Key2> 
    ... 
    <KeyN>ValueN.ToString()</KeyN> 
<!--</SomeEnclosingElement>--> 

использованием XmlSerializer, если это возможно, без обычая реализация IXmlSerializable?

Пожалуйста, обратите внимание две вещи:

  • Элемент (тег) имена меняется от узла к узлу
  • Нет ограждающую элемент, необходимый на всех (я заметил это прежде всего, чтобы лучше проиллюстрировать это требование)

ответ

1

С учетом ваших требований не применять IXmlSerializable, вы можете добавить суррогатное имущество public XElement[], помеченное знаком [XmlAnyElement], к вашему типу:

[XmlIgnore] 
    public List<KeyValuePair<string, object>> Items { get; set; } 

    [XmlAnyElement] 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    public XElement[] XmlItems 
    { 
     get 
     { 
      if (Items == null) 
       return null; 
      return Items.Select(p => new XElement(p.Key, (p.Value ?? string.Empty).ToString())).ToArray(); 
     } 
     set 
     { 
      if (value == null) 
       return; 
      Items = Items ?? new List<KeyValuePair<string, object>>(value.Length); 
      foreach (var e in value) 
      { 
       Items.Add(new KeyValuePair<string, object>(e.Name.LocalName, e.Value)); 
      } 
     } 
    } 

Оригинальное свойство помечается [XmlIgnore] в то время как суррогат свойство возвращает массив XElement объектов, имена которых отображаются с KeyValuePair.Key и чьи значения отображаются с KeyValuePair.Value.ToString().

Образец fiddle.

Смежные вопросы