2016-06-29 6 views
1

Newtonsoft Jsonデシリアライザには、JsonExtensionDataAttributeという属性があります。これにより、クラスに一致するメンバーがないすべてのJTokensを非直列化することができます。.NET JsonExtensionData Xml逆シリアル化の類推

.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辞書に行きます。

答えて

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属性に注意してください。私たちはイベントを引き起こすためにそれを使用しなければなりません。

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;} 
} 

これは、両方のシリアライズとDeserializのために働きますation。 デシリアライズ中に、一致しないノードはすべてAdditionalElements配列にプッシュされます。

関連する問題