【发布时间】:2019-03-22 15:33:55
【问题描述】:
我有一个像这样的基类:
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>
这怎么办??将每个传感器加载到最初存储的子类中??
【问题讨论】:
-
缺少
XmlIncludeAttribute。您可以发布错误消息(实际上这是一个投票关闭的原因)并查找重复的错误或直接搜索该属性。 -
添加了具体错误(''unexpected at ..")
XmlIncludeAttribute是什么意思?? -
使用基本类型进行序列化/反序列化可能也足够了(在您的情况下是
Sensor),请参阅this。 -
该死!这行得通。我添加了
[XmlInclude(typeof(all my sub types))]然后保存到 BASE 类,而不是实际的。并且在加载时,它们被加载为基本传感器,但它们保留了有关实际类的信息。如果有人会写信并回答,我会接受。如果没有,我会自己写
标签: c# xml serialization