Я пытаюсь сериализовать объект, содержащий список базовых и производных типов.Пример кода приведен ниже.Когда в списке есть только базовые объекты, сериализация работает правильно.Но когда я добавляю объект типа '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()
{}
}