Удивительно, сколько людей не понимает, что это объектно-ориентировано также.
Вам нужно будет передать GetType (DerivedClass) конструктору сериализатора, он должен соответствовать типу сериализуемого объекта. Вы можете использовать атрибут
для переименования в корневой элемент. Этот пример кода работал так, как задумано:
using System;
using System.Xml.Serialization;
using System.IO;
class Program {
static void Main(string[] args) {
var obj = new DerivedClass();
obj.Prop = 42;
var xs = new XmlSerializer(typeof(DerivedClass));
var sw = new StringWriter();
xs.Serialize(sw, obj);
Console.WriteLine(sw.ToString());
var sr = new StringReader(sw.ToString());
var obj2 = (BaseClass)xs.Deserialize(sr);
Console.ReadLine();
}
}
public class BaseClass {
public int Prop { get; set; }
}
[XmlRoot("BaseClass")]
public class DerivedClass : BaseClass { }
Я не пробовал, но можете ли вы просто его не преобразовать?
serializer(stream, (BaseClass)derived);
Edit
Кроме того, если вы хотите иметь один XmlSerialiser, который может работать с несколькими производными классами и базовый класс, то вам нужно указать все типы в конструкторе XmlSerialiser.
XmlSerializer serializer = new XmlSerializer(typeof(BaseClass), new Type[] {typeof(DerivedClass)});
Затем он успешно сериализует несколько типов. Однако вам также придется использовать упомянутое выше решение, чтобы выходной xml совпадал между классами.
После небольшого поиска в Google;) я могу сказать, что вам понадобится еще немного кода и реализовать IXmlSerializable
для вашего базового класса, объявив все методы интерфейса как виртуальные и переопределив их в производном классе. Вот пример темы и аналогичной проблемы , решенной упомянутым интерфейсом.