序列化列表<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.
假设我们有一个:
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.