C#。根据属性反序列化为相同类型

时间:2017-10-19 15:10:07

标签: c# xml serialization

我一直在进行反序列化并被卡住了。

有我的课程:

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]属性来执行此操作? 我需要{strong>父

中的List<Child>(Child1或Child2,具体取决于attrute AttribName

3 个答案:

答案 0 :(得分:1)

XmlSerializer不支持基于属性的鉴别器;只有元素名称。因此,您可以将XmlSerializer用于 - 但不是您的方案:

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

选项:

  • 手动反序列化
  • 在反序列化之前转换xml
  • 只需更改xml格式
  • 即可

答案 1 :(得分:0)

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

答案 2 :(得分: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);