【问题标题】:serialize derived xml to base class in C#在 C# 中将派生的 xml 序列化为基类
【发布时间】: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&lt;Sensor&gt;,其中混合了不同的传感器。我想将它们保存到 XML 文件中,然后再加载它们。

我尝试了一个简单的:

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

问题是当反序列化器找到&lt;PositionSensor&gt; 时它会崩溃(Unexpected &lt;PositionSensor&gt; at 2,2).. 我猜它期待&lt;Sensor&gt;

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

【问题讨论】:

  • 缺少XmlIncludeAttribute。您可以发布错误消息(实际上这是一个投票关闭的原因)并查找重复的错误或直接搜索该属性。
  • 添加了具体错误(''unexpected at ..")XmlIncludeAttribute 是什么意思??
  • 使用基本类型进行序列化/反序列化可能也足够了(在您的情况下是Sensor),请参阅this
  • 该死!这行得通。我添加了 [XmlInclude(typeof(all my sub types))] 然后保存到 BASE 类,而不是实际的。并且在加载时,它们被加载为基本传感器,但它们保留了有关实际类的信息。如果有人会写信并回答,我会接受。如果没有,我会自己写

标签: c# xml serialization


【解决方案1】:

首先您应该将标签[XmlInclude(typeof(DerivedClass))] 添加到基类。所以它看起来像:

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

然后,当您将任何派生类保存到 xml 文件时,将它们保存为 Sensor,而不是派生类。

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

那么当作为 Sensor 读取 xml 时,您仍然可以识别它们实际属于的子类。

Sensor myImportedSensor = Sensor.Load("myTemp.xml")
// myImportedSensor is Sebsir returns true
// AND
// myImportedSensor is TemperatureSensor returns also true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多