派生类反序列化

时间:2012-11-01 18:44:16

标签: c# xml deserialization derived-class

我的逻辑仿真程序出现反序列化问题。
这是我的元素类:

public class AndGateData : TwoInputGateData
{

}

public class TwoInputGateData : GateData
{
    public TwoInputGateData()
    {
        Input2 = new InputData();
        Input1 = new InputData();
    }
    public InputData Input1 { get; set; }
    public InputData Input2 { get; set; }
}

public class GateData : ElementData
{
    public GateData()
    {
        OutputData = new OutputData();
    }

    public OutputData OutputData { get; set; }
}

public class ElementData
{
    public int Delay { get; set; }
    public Guid Id { get; set; }
}

以下是负责套接字的类:

public class InputData : SocketData
{

}

public class SocketData
{
    public Guid Id { get; set; }
    public SignalData SignalData { get; set; }
}

SignalData在这里并不重要。所以,除非有人说这是必要的,否则我不会写它(为了保持这个问题的清洁)。

CircuitData非常重要:

[XmlRoot("Circuit")]
public class CircuitData
{
    [XmlElement(typeof(AndGateData))]
    [XmlElement(typeof(OrGateData))]
    public List<ElementData> elements = new List<ElementData>();
    public List<WireData> wires = new List<WireData>();
    public void AddElement(ElementData element)
    {
        elements.Add(element);
    }
    public void AddWire(WireData wire)
    {
        wires.Add(wire);
    }
}

电线现在并不重要。
现在,我写了一些序列化:

public class CircuitDataWriter
{
     public static void Write(object obj, string fileName)
     {
         var xmlFormat = new XmlSerializer(typeof(CircuitData));
         using(Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None) )
         {
             xmlFormat.Serialize(fStream,obj);
         }
         Console.WriteLine("Circuit saved in XML format.");
     }

}

它就像我想要的那样工作,它产生了xml文档:

<?xml version="1.0"?>
-<Circuit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
-<AndGateData> 
<Delay>10</Delay> 
<Id>bfee6dd7-5946-4b7b-9d0b-15d5cf60e2bf</Id> 
-<OutputData> <Id>00000000-0000-0000-0000-000000000000</Id> </OutputData> 
-<Input1> <Id>7c767caf-79a9-4c94-9e39-5c38ec946d1a</Id> <SignalData xsi:type="SignalDataOn"/> </Input1> 
-<Input2> <Id>d2cad8f8-8528-4db3-9534-9baadb6a2a14</Id> <SignalData xsi:type="SignalDataOff"/> </Input2> 
</AndGateData> 
<wires/> 
</Circuit>

但我的DESERIALIZATION有问题。以下是代码:

public static CircuitData Read()
{
    var reader = new XmlSerializer(typeof(CircuitData));
    StreamReader file = new StreamReader("Circuit.xml");
    var returnCircuitData = new CircuitData();
    returnCircuitData = (CircuitData) reader.Deserialize(file);
    return returnCircuitData;
}

现在,它将我的Circuit.xml反序列化为对象,但此对象仅包含IdDelay,它不包含Input1Input2或{ {1}}。因此,它被视为Output,而不是Element。我试图解决它一天,但似乎没有人有这样的问题。

1 个答案:

答案 0 :(得分:1)

我向您提出建议,将Write方法设为通用,并使用objectToSerialize.GetType()创建序列化程序:

public static void Write<T>(T objectToSerialize, string fileName)
{
    var xmlSerializer = new XmlSerializer(objectToSerialize.GetType());
    ...
}

XmlSerializer.Deserialize()方法返回对象,您可以将Read方法设为通用,如下所示:

public static T Read<T>(string fileName)
{
    var serializer = new XmlSerializer(typeof(T));
    using (StreamReader file = new StreamReader(fileName))
    {
        return (T)serializer.Deserialize(file);
    }
}

除此之外,您可能需要阅读:

相关问题