2017-10-19 37 views
1

我一直在反序列化,并得到stucked。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]属性做到这一点? 我需要List<Child>(Child1或CHILD2,取决于attrute ATTRIBNAME)在

+0

是出现在这所需要的XML格式?还是你有灵活性来决定它应该是什么样子? – JuanR

+0

作为一个方面说明:*原因*,这不是一个支持的方案的一部分是* xsd *不支持此 –

+0

- Xml需要此格式 – snowil

回答

0

可以使用自定义XML阅读器这样的:

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结构。序列化之前的转换将是非常繁重的操作。似乎我需要编写自定义序列化。谢谢 – snowil

0

在我的情况下,强xm l格式和非常大的文件我只有一个解决方案 - 自定义序列化。

相关问题