В C #, как я могу использовать XmlSerializer
для десериализации объекта, который может быть базового класса или любого из нескольких производных классов, не зная заранее типа?
Все мои производные классы добавляют дополнительные элементы данных. Я сделал простой графический интерфейс, который может сериализовать и десериализовать объекты класса. Он будет сериализовывать объекты в соответствии с унаследованным классом (или даже просто базовым классом) в зависимости от того, какие поля пользователь выбирает для заполнения.
У меня нет проблем с сериализацией; проблема в десериализации. Как я могу получить десериализацию данных XmlSerializer
в правильный производный класс, не зная заранее класс? В настоящее время я создаю XmlReader
, чтобы прочитать первый узел файла 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();