序列化列表<KeyValuePair<string, object>>

Serialize a List<KeyValuePair<string, object>>

假设我们有一个:

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

如何序列化如下:

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

使用 XmlSerializer,如果可能,不自定义实现 IXmlSerializable?

请注意两点:

鉴于您的要求不实施 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],而代理项属性 returns一个XElement对象的数组,其名称映射自KeyValuePair.Key 并且其值映射自 KeyValuePair.Value.ToString().

示例 fiddle.