в противном случае, если вы хотите добавить типы при сериализации:

, как я могу использовать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();

Ответы на вопрос(1)

Ваш ответ на вопрос