В С#, как я могу использовать XmlSerializer
для десериализации объекта, который может быть базового класса или любого из нескольких производных классов, не зная заранее тип?
Все мои производные классы добавляют дополнительные члены данных. Я сделал простой графический интерфейс, который может сериализовать и десериализовать объекты класса. Он будет сериализовать объекты, поскольку любой унаследованный класс (или даже просто базовый класс) подходит на основе того, какие поля пользователь выбирает для заполнения.
У меня нет проблем с сериализацией; проблема заключается в десериализации. Как я могу иметь XmlSerializer
десериализовать данные в правильный производный класс, не зная класса заранее? В настоящее время я создаю XmlReader
для чтения первого node файла XML и определения класса из него, и, похоже, он работает для моих целей, но он кажется крайне неэлегантным решением.
Я разместил несколько примеров кода ниже. Любые предложения?
BaseType objectOfConcern = new BaseType();
XmlSerializer xserializer;
XmlTextReader xtextreader = new XmlTextReader(DEFAULT_FILENAME);
do { xtextreader.Read(); } while (xtextreader.NodeType != XmlNodeType.Element);
string objectType = xtextreader.Name;
xtextreader.Close();
FileStream fstream = new FileStream(DEFAULT_FILENAME, FileMode.Open);
switch (objectType)
{
case "type1":
xserializer = new XmlSerializer(typeof(DerivedType));
objectOfConcern = (DerivedType)xserializer.Deserialize(fstream);
//Load fields specific to that derived type here
whatever = (objectOfConcern as DerivedType).NoOfstreamubordinates.ToString();
case "xxx_1":
//code here
case "xxx_2":
//code here
case "xxx_n":
//code here
//and so forth
case "BaseType":
xserializer = new XmlSerializer(typeof(BaseType));
AssignEventHandler(xserializer);
objectOfConcern = (BaseType)xserializer.Deserialize(fstream);
}
//Assign all deserialized values from base class common to all derived classes here
//Close the FileStream
fstream.Close();