1

我的逻辑模拟程序有反序列化问题。
这是我的元素类:

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>

但是我的反序列化有问题。这是代码:

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;
}

现在,它反序列化了 my Circuit.xmlto 对象,但这个对象只包含Idand Delay,它不包含Input1, Input2or Output。因此,它被视为Element,而不是AndGate。我试图解决它一天,但似乎没有人有这种问题。

4

1 回答 1

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);
    }
}

除此之外,您可能还想阅读:

于 2012-11-01T20:00:35.813 回答