2016-11-23 145 views
1

讓我們假設我們有一個:序列化一個List <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

相關問題