2012-11-01 136 views
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; 
} 

现在,我反序列化到Circuit.xml对象,但这个对象仅包含IdDelay,它不包含Input1Input2Output。所以,它被视为Element,而不是像AndGate。我试图解决它一天,但似乎没有人有这样的问题。

+0

尝试添加参数构造成'InputData'的系列化

  • XmlArrayXmlArrayItem。它会反序列化吗? – Gromer

  • 回答

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

    以外,你可能想了解:

    • XmlInclude在序列化派生类时使用。被用于控制阵列