在Newtonsoft Json反序列化器中有一个属性JsonExtensionDataAttribute,它允许将类没有匹配成员的所有JTokens反序列化为字典。
.NET中的Xml序列化有什么相似之处吗?
例如:我有XML:
<MyCustomObject>
<classProp1>Value 1</classProp1>
<dynamicProp1>dynamic prop value</dynamicProp1>
<dynamicProp2>dynamic prop 2 value<dynamicProp2>
<MyCustomObject>
我想要映射到班级:
public class MyCustomObject
{
public string classProp1 {get;set;}
[XmlExtensionData]
public IDictionary<string, XNode> AdditionalData{get;set;}
}
所以所有不匹配的Xml节点(dynamicProp1,dynamicProp2)都将转到AdditionalData字典。
答案 0 :(得分:2)
我找到了使用现有属性的最简单的解决方案:
示例:
public class MyCustomObject
{
public string classProp1 {get;set;}
[XmlAnyElement]
public XmlElement[] AdditionalElements {get;set;}
[XmlAnyAttribute]
public XmlAttribute[] AdditionalAttrs {get;set;}
}
这适用于序列化和反序列化。 在反序列化期间,所有不匹配的节点都将被推送到AdditionalElements数组。
答案 1 :(得分:1)
您可以使用UnknownElement
事件。
var xs = new XmlSerializer(typeof(MyCustomObject));
xs.UnknownElement += Xs_UnknownElement;
MyCustomObject my;
using (var fs = new FileStream("test.xml", FileMode.Open))
my = (MyCustomObject)xs.Deserialize(fs);
void Xs_UnknownElement(object sender, XmlElementEventArgs e)
{
var my = (MyCustomObject)e.ObjectBeingDeserialized;
if (my.AdditionalData == null)
my.AdditionalData = new Dictionary<string, string>();
my.AdditionalData[e.Element.LocalName] = e.Element.InnerText;
}
public class MyCustomObject
{
public string classProp1 { get; set; }
[XmlIgnore]
public IDictionary<string, string> AdditionalData { get; set; }
}
请注意XmlIgnore
属性。我们必须使用它才能触发事件。