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>

しかし、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;
}

これで、 my をオブジェクトに逆シリアル化しますが、このオブジェクトにはandCircuit.xmlのみが含まれ、 , orは含まれません。したがって、 のようにではなく、 のように扱われます。私はそれを一日解決しようとしましたが、誰もそのような問題を抱えていないようです.IdDelayInput1Input2OutputElementAndGate

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

それ以外にあなたは読みたいかもしれません:

  • 派生クラスをシリアル化するときに使用されるXmlInclude 。
  • 配列のシリアル化を制御するために使用されるXmlArrayおよびXmlArrayItem
于 2012-11-01T20:00:35.813 に答える