XML-сериализация списка, содержащего объекты как базового, так и производного типа - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь сериализовать объект, содержащий список базовых и производных типов.Пример кода приведен ниже.Когда в списке есть только базовые объекты, сериализация работает правильно.Но когда я добавляю объект типа 'CompositeElement', вызов Serialize() показывает исключение.

"InvalidOperationException: тип SerializeTest.CompositeElement не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указатьтипы, которые не известны статически. "

Есть ли способ сериализации списка смешанного типа, подобного этому?

private void Save(String path)
{
    ConfXML confXML = new ConfXML();
    confXML.ElementList = new List<Element>();

    // Add base element
    for (int i = 0; i < 3; i++)
        confXML.ElementList.Add(new Element(Type.Element, i.ToString()));

    // Add composite element
    CompositeElement compElement = new CompositeElement(Type.CompositeElement, "Composite", "Sensor1");
    confXML.ElementList.Add(compElement);

    XmlSerializer serializer = new XmlSerializer(typeof(ConfXML));
    using (TextWriter writer = new StreamWriter(path))
    {
        XmlSerializerNamespaces nameSpace = new XmlSerializerNamespaces();
        nameSpace.Add("", "");
        serializer.Serialize(writer, confXML, nameSpace);
    }
}

public enum Type
{
    Element,
    CompositeElement,
}

public class ConfXML
{
    private List<Element> elementList;

    [XmlElement("Elements")]
    public List<Element> ElementList
    {
        get { return elementList; }
        set { elementList = value; }
    }
}

public class Element
{
    private Type type;
    [XmlAttribute]
    public Type Type
    {
        get { return type; }
        set { type = value; }
    }


    private String name;
    [XmlAttribute]
    public String Name
    {
        get { return name; }
        set { name = value; }
    }

    public Element(Type typ, String nam)
    {
        this.Type = typ;
        this.Name = nam;
    }

    public Element()
    { }
}

public class CompositeElement : Element
{
    private String compData;
    [XmlAttribute]
    public String CompData
    {
        get { return compData; }
        set { compData = value; }
    }

    public CompositeElement(Type typ, String nam, String data) : base(typ, nam)
    {
        this.CompData = data;
    }

    public CompositeElement()
    {}
}
...