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) });
Другие вопросы по тегам