2017-10-19 11 views
1

私はデシリアライゼーションの作業をしていました。C#。属性に応じて同じタイプに逆シリアル化します

あり、私のクラスには、次のとおりです。

public class Parent 
{ 
    public List<Child> child {get;set} 
} 

public class Child 
{ 
    some properties 
} 

public class Child1 : Child 
{ 
    some properties 
} 

public class Child2 : Child 
{ 
    some properties 
} 

そして私は、XMLがあります

<Parent> 
    <Child AttribName="TypeOne"> 
    </Child> 
    <Child AttribName="TypeTwo"> 
    </Child> 
</Parent> 

私はいくつかの[XML]属性は、これを行うために使用することができますどのように? 私は親に(attrute ATTRIBNAMEに応じて、CHILD1またはCHILD2)List<Child>必要

+0

が、この中に表示されるために必要なXMLですフォーマット?あるいは、あなたはそれがどのように見えるべきかを指示する柔軟性を持っていますか? – JuanR

+0

を副題として*理由の一部*これはサポートされているシナリオではありません* xsd *はこれをサポートしていません –

+0

- Xmlはこの形式になります – snowil

答えて

0

:ベースクラスに属性を追加

public class CustomXmlReader : XmlTextReader 
{ 
    public CustomXmlReader(string url) : base(url) { } 

    public override string GetAttribute(string localName, string namespaceURI) 
    { 
     if (namespaceURI == "http://www.w3.org/2001/XMLSchema-instance" && localName == "type") 
     { 
      if (base.LocalName == "Child") 
      { 
       var attr = base.GetAttribute("AttribName"); 

       if (attr == "TypeOne") 
        return "Child1"; 
       if (attr == "TypeTwo") 
        return "Child2"; 
      } 
     } 
     return base.GetAttribute(localName, namespaceURI); 
    } 
} 

を:

[XmlInclude(typeof(Child1))] 
[XmlInclude(typeof(Child2))] 
public class Child 

使用例:

var xs = new XmlSerializer(typeof(Parent)); 

Parent parent; 

using (var xmlReader = new CustomXmlReader("test.xml")) 
    parent = (Parent)xs.Deserialize(xmlReader); 
+0

素晴らしいです!できます – snowil

1

XmlSerializer属性に基づいて弁別をサポートしていません。要素名のみ。だから、のために、このXmlSerializerを使用することができます - ではなく、あなたのシナリオ:

<Parent> 
    <ChildTypeOne> 
    </ChildTypeOne> 
    <ChildTypeTwo> 
    </ChildTypeTwo> 
</Parent> 

オプション:

  • 手動
  • が直列化復元する前にXMLを変換、それをデシリアライズ
  • 単にxml形式を変更
+0

私は強く大きなxml構造を持っています。シリアライズ前の変換は非常に重い操作になります。私はカスタムserializtionを書く必要があるようだ。ありがとうございます – snowil

0

私の場合、強いxm私はちょうど1つの解決策を持っています - カスタムシリアル化。

あなたはこのようなカスタムXMLリーダーを使用することができます
関連する問題