сериализовать производный XML в базовый класс в C # - PullRequest
0 голосов
/ 22 марта 2019

У меня есть базовый класс, например:

public class Sensor
{
        public void Serialize(string path)
        {
            try
            {
                System.Xml.Serialization.XmlSerializer xml = new System.Xml.Serialization.XmlSerializer(this.GetType());
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(System.IO.Path.GetFullPath(path)))
                {
                    xml.Serialize(file, this);
                }
            }
            catch (Exception e)
            {
                ;
            }
        }

        public static T Deserialize<T>(string path)
        {
            T loaded = default(T);
            try
            {
                System.Xml.Serialization.XmlSerializer deserializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
                using (StreamReader reader = new StreamReader(path))
                {
                    loaded = (T)deserializer.Deserialize(reader);
                }
            }
            catch (Exception e)
            {
                ;
            }
            return loaded;
        }

}

Затем у меня есть пара классов, которые вытекают из этого:

public TemperatureSensor : Sensor {}

public PositionSensor :Sensor{}

Они имеют некоторые общие интерфейсы, но также реализуют вещи по-разному,У меня есть SensorController, который содержит List<Sensor> со смесью разных датчиков.Я хочу сохранить их в XML-файлы и впоследствии загрузить их.

Я попробовал простое:

public void Load()
        {
            var files = Directory.GetFiles(directory, "*.xml");
            foreach(var file in files)
            {
                var p = CodePuzzle.Deserialize<Puzzle>(file);
            }
        }

Проблема в том, что, когда десериализатор находит <PositionSensor>, он падает (Unexpected <PositionSensor> at 2,2) .. Я думаю, это ожидало <Sensor>

Как это можно сделать ??Загрузка каждого датчика в подкласс, в котором он изначально хранился

1 Ответ

0 голосов
/ 23 марта 2019

Сначала вы должны добавить тег [XmlInclude(typeof(DerivedClass))] в базовый класс. Так это выглядит так:

[Serializable]
[XmlInclude(typeof(TemperatureSensor))]
[XmlInclude(typeof(PositionSensor))]
public Class Sensor 
   ....

Затем при сохранении в xml-файле любого производного класса сохраните его как Sensor, а не как производный класс.

var myTemp = new TemperatureSensor();
Sensor.saveToXML(myTemp,"myTemp.xml")

Затем, читая xml в качестве датчика, вы все равно можете идентифицировать подкласс, к которому они на самом деле принадлежат.

Sensor myImportedSensor = Sensor.Load("myTemp.xml")
// myImportedSensor is Sebsir returns true
// AND
// myImportedSensor is TemperatureSensor returns also true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...