Правило 1. / Ваши производные классы должны отвечать за сериализацию и десериализацию самих себя, поскольку они должны быть единственными, кто обладает глубокими знаниями о дополнительных данных, хранящихся в документе XML.
Таким образом, с точки зрения пломорфизма (обратите внимание, что приведенный выше код не является полиморфным), вы бы сделали что-то вроде
public class SpecialClass
{
public virtual XElement SerializeToXML()
{
// Base impl
}
}
public class YourDerivedClasses
{
public override XElement SerializeToXML()
{
//derived implementation
}
}
Довольно прямо. Но у вас проблема не в сериализации или полиморфном поведении, а в создании экземпляра правильного типа из XML.
Одним из способов решения этой проблемы является наличие в вашем XML-документе ключа, указывающего тип, который его сохранил, и регистрация фабрики, ответственной за создание производного типа, проиндексированного этим ключом (атрибуты хороши для такой регистрации ), после создания производного типа используйте его для десериализации xml.
Обратите внимание, ваша фабрика также может быть статическим методом в Базовом классе.
Что-то вроде (конечно, не проверено) ....
public class SpecialClass
{
***snip
public static IEnumerable<SpecialClass> GetAllClasses(XElement xml)
{
IDictionary keyedtypes = GetKeyedTypesDictUsingReflection() // the registered factories
foreach(var x in xml.Elements("YourClassesNode"))
{
string key = //get key from xml
yield return keyedTypes[key].DeserializeFromXML(x);
}
}
}