使用XmlSerializer来序列化派生类

20
我正在使用XmlSerializer来序列化一个包含泛型列表的对象。
问题是每个元素都是从ChildBase派生出来的,而ChildBase实际上是一个抽象类。 当我尝试反序列化时,会出现一个无效操作异常。
有没有办法可以使用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);
    }
}

现在尝试应用以下代码:[XmlRoot(ElementName = "myWrapper", Namespace = "http://URL/")]public class MyWrapper - Brian J. Hakim
1
请注意,方法1似乎无法用于反序列化集合。需要使用方法2或方法3,以便反序列化程序能够确定如何将xml中的节点映射回集合中的项。 - Craig

5

0

另一种选择是,如果定义在另一个命名空间中,则可以从派生类动态设置类型: XmlAttributeOverride


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接