Эти ссылки, вероятно, будут вам полезны:
У меня сложный проект удаленного взаимодействия, и я хотел очень жестко контролировать сериализованный XML. Сервер мог получать объекты, которые он не знал, как десериализовать, и наоборот, поэтому мне нужен был способ их быстрой идентификации.
Всем .NET-решениям, которые я пробовал, не хватало необходимой гибкости для моего проекта.
Я храню атрибут int в базовом xml для идентификации типа объекта.
Если мне нужно создать новый объект из xml, я создал фабричный класс, который проверяет атрибут type, затем создает соответствующий производный класс и передает ему xml.
Я сделал что-то вроде этого (вытащил это из памяти, так что синтаксис может быть немного не так):
(1) Создан интерфейс
interface ISerialize
{
string ToXml();
void FromXml(string xml);
};
(2) Базовый класс
public class Base : ISerialize
{
public enum Type
{
Base,
Derived
};
public Type m_type;
public Base()
{
m_type = Type.Base;
}
public virtual string ToXml()
{
string xml;
// Serialize class Base to XML
return string;
}
public virtual void FromXml(string xml)
{
// Update object Base from xml
}
};
(3) Производный класс
public class Derived : Base, ISerialize
{
public Derived()
{
m_type = Type.Derived;
}
public override virtual string ToXml()
{
string xml;
// Serialize class Base to XML
xml = base.ToXml();
// Now serialize Derived to XML
return string;
}
public override virtual void FromXml(string xml)
{
// Update object Base from xml
base.FromXml(xml);
// Update Derived from xml
}
};
(4) Объект фабрики
public ObjectFactory
{
public static Base Create(string xml)
{
Base o = null;
Base.Type t;
// Extract Base.Type from xml
switch(t)
{
case Base.Type.Derived:
o = new Derived();
o.FromXml(xml);
break;
}
return o;
}
};