假设我们有:
public List<KeyValuePair<string, object>> Items { get; set; }
我们如何将其序列化如下:
<!--<SomeEnclosingElement>-->
<Key1>Value1.ToString()</Key1>
<Key2>Value2.ToString()</Key2>
...
<KeyN>ValueN.ToString()</KeyN>
<!--</SomeEnclosingElement>-->
尽可能使用XmlSerializer
,而不使用IXmlSerializable
的自定义实现?
请注意两件事:
答案 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。