2016-11-23 140 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

相关问题