![](/img/trans.png)
[英]C# - Serialize all attributes of derived class in a list of base class
[英]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.