Как мне использовать XmlSerializer для десериализации объекта, который может относиться к базовому или производному классу, не зная заранее его тип?

В 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();
20
задан Shekhar_Pro 26 January 2011 в 04:25
поделиться