.NET JsonExtensionData类似于Xml反序列化

时间:2016-06-29 20:50:57

标签: .net xml serialization xml-deserialization

在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字典。

2 个答案:

答案 0 :(得分:2)

我找到了使用现有属性的最简单的解决方案:

  

System.Xml.Serialization.XmlAnyElement

     

System.Xml.Serialization.XmlAnyAttribute

示例:

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属性。我们必须使用它才能触发事件。