C# Исключение при попытке сериализации динамического производного объекта
У меня есть следующие классы:
[XmlInclude(typeof(Cat))]
[XmlInclude(typeof(Dog))]
[XmlInclude(typeof(Cow))]
[Serializable]
public abstract class Animal
{
public string Name { get; set; }
}
public class Cow : Animal
{
public Cow(string name) { Name = name; }
public Cow() { }
}
public class Dog : Animal
{
public Dog(string name) { Name = name; }
public Dog() { }
}
public class Cat : Animal
{
public Cat(string name) { Name = name; }
public Cat() {}
}
and the following code snippet:
var animalList = new List<Animal>();
Type type = AnimalTypeBuilder.CompileResultType("Elephant", propertiesList);
var elephant = Activator.CreateInstance(type);
animalList.Add(new Dog());
animalList.Add(new Cat());
animalList.Add(new Cow());
animalList.Add((Animal)elephant);
using (var writer = new System.IO.StreamWriter(fileName))
{
var serializer = new XmlSerializer(animalList.GetType());
serializer.Serialize(writer, animalList);
writer.Flush();
}
Когда я пытаюсь сериализовать этот список, я получаю "System.InvalidOperationException: тип Elephant не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые статически не известны". сначала я также получил это исключение для объектов cat, cow и dog и решил его, добавив [XmlInclude(typeof())] к их классам, как показано выше, но я не могу найти аналогичное решение для динамического производного типа, так как атрибут устанавливается во время компиляции..
1 ответ
Вы можете сказать XmlSerializer
о дополнительных типах, необходимых через конструктор во время выполнения. Например:
var serializer = new XmlSerializer(animalList.GetType(), new[] { typeof(Elephant) });