序列化List <keyvaluepair <string,object =“”>&gt;

时间:2016-11-23 00:15:46

标签: c# .net xml-serialization xmlserializer

假设我们有:

    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 个答案:

答案 0 :(得分:1)

鉴于您要求不实施IXmlSerializable,您可以在您的类型中添加标有[XmlAnyElement]public XElement[]代理资产:

    [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],而surrogate属性返回XElement个对象数组,其名称从KeyValuePair.Key映射,其值从KeyValuePair.Value.ToString()映射。

示例fiddle