繁体   English   中英

序列化派生的xml到C#中的基类

[英]serialize derived xml to base class in C#

我有一个基类,如:

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>

怎么办? 将每个传感器加载到它最初存储在子类中的子类中?

首先,您应该将标记[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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM