使用XmlSerializer序列化派生类

问题描述 投票:0回答:3

我正在使用

XmlSerializer
序列化包含通用列表的对象

List <ChildBase> Children {get;set}

问题是每个元素都派生自

ChildBase
,它实际上是一个抽象类。 当我尝试反序列化时,我收到 invalidOperationException

有没有办法可以将

XmlSerializer
与派生对象一起使用?

c# xml polymorphism xml-serialization xmlserializer
3个回答
49
投票

有三种方法可以做到这一点;您可以对类型使用

[XmlInclude]
,也可以对属性使用
XmlElement
/
XmlArrayItem
。它们都如下所示;取消注释您喜欢的一对:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
public class MyWrapper {
    //2: [XmlElement("A", Type = typeof(ChildA))]
    //2: [XmlElement("B", Type = typeof(ChildB))]
    //3: [XmlArrayItem("A", Type = typeof(ChildA))]
    //3: [XmlArrayItem("B", Type = typeof(ChildB))]
    public List<ChildClass> Data { get; set; }
}
//1: [XmlInclude(typeof(ChildA))]
//1: [XmlInclude(typeof(ChildB))]
public abstract class ChildClass {
    public string ChildProp { get; set; }
}
public class ChildA : ChildClass {
    public string AProp { get; set; }
}
public class ChildB : ChildClass {
    public string BProp { get; set; }
}
static class Program {
    static void Main() {
        var ser = new XmlSerializer(typeof(MyWrapper));
        var obj = new MyWrapper {
            Data = new List<ChildClass> {
                new ChildA { ChildProp = "abc", AProp = "def"},
                new ChildB { ChildProp = "ghi", BProp = "jkl"}}
        };
        ser.Serialize(Console.Out, obj);
    }
}

5
投票

您可以使用 XmlIncludeAttribute 来实现此目的。或者参见 this 帖子了解另一种方法。


0
投票

另一个选项是从派生类动态设置类型(如果在另一个命名空间中定义): XmlAttributeOverride

© www.soinside.com 2019 - 2024. All rights reserved.