簡體   English   中英

c#中的XML序列化/反序列化

[英]XML Serialization / Deserialization of List in c#

我有這樣的類結構:

 public List<EndpointInfo> EndpointInfoList = new List<EndpointInfo> ();


 [Serializable]
    public class EndpointInfo
    {
        public List<PairedEndpoint> PairedEndpoints { get; set; }

        public EndpointInfo ()
        {
            PairedEndpoints         = new List<PairedEndpoint> ();
        }

    }

    public class PairedEndpoint
    {
        public List<int>    ConnectedChannels { get; set; }

        public PairedEndpoint ()
        {
            ConnectedChannels = new List<int>();
        }
    }

我希望生成的XML看起來像這樣

<?xml version="1.0"?>
<ArrayOfEndpointInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <EndpointInfo>
    <PairedEndpoints>
      <PairedEndpoint>
        <ConnectedChannels>
            <ConnectedChannel>1</ConnectedChannel>
            <ConnectedChannel>2</ConnectedChannel>
        </ConnectedChannels>
      </PairedEndpoint>
      <PairedEndpoint>
        <ConnectedChannels>
            <ConnectedChannel>3</ConnectedChannel>
            <ConnectedChannel>4</ConnectedChannel>
        </ConnectedChannels>
      </PairedEndpoint>
    </PairedEndpoints>
  </EndpointInfo>
</ArrayOfEndpointInfo>

但是,我真的不知道應該如何序列化PairedEndpoints來創建其中的通道列表。 我將不勝感激任何幫助。

嘗試這個 :

public class ArrayOfEndpointInfo
{
    [XmlElement(ElementName = "EndpointInfo")]
    public EndpointInfo EndPointInfo { get; set; }
}


public class EndpointInfo
{
    [XmlArray(ElementName = "PairedEndpoints")]
    public List<PairedEndpoint> PairedEndpoints { get; set; }

}
public class PairedEndpoint
{
    [XmlArrayItem(ElementName="ConnectedChannel")]
    public List<int> ConnectedChannels { get; set; }
}

然后:

var t = new XmlSerializer(typeof(ArrayOfEndpointInfo));
var result = t.Deserialize(new StreamReader("path"));

你使用XmlSerializer

public class ProcessXml
{
    public void ReadXml()
    {
        var xml = "<ArrayOfEndpointInfo xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
                @"<EndpointInfo>
                    <PairedEndpoints>
                      <PairedEndpoint>
                        <ConnectedChannels>
                            <ConnectedChannel>1</ConnectedChannel>
                            <ConnectedChannel>2</ConnectedChannel>
                        </ConnectedChannels>
                      </PairedEndpoint>
                      <PairedEndpoint>
                        <ConnectedChannels>
                            <ConnectedChannel>3</ConnectedChannel>
                            <ConnectedChannel>4</ConnectedChannel>
                        </ConnectedChannels>
                      </PairedEndpoint>
                    </PairedEndpoints>
                  </EndpointInfo>
                </ArrayOfEndpointInfo>";
        var serializer = new XmlSerializer(typeof(ArrayOfEndpointInfo));
        serializer.UnknownNode += Serializer_UnknownNode;
        serializer.UnknownAttribute += Serializer_UnknownAttribute;
        var result = serializer.Deserialize(GenerateStreamFromString(xml)) as ArrayOfEndpointInfo;
        WriteXml(result);
    }

    public void WriteXml(ArrayOfEndpointInfo info)
    {
        var writer = XmlWriter.Create(@"D:\temp\myXml.xml");//Here you can use different overload to get xml in variable, eg. TextWriter etc.
        var serializer = new XmlSerializer(typeof(ArrayOfEndpointInfo));
        serializer.Serialize(writer, info);
        writer.Close();
    }


    private static void Serializer_UnknownNode(object sender, XmlNodeEventArgs e)
    {
        Console.WriteLine("Unknown Nodes: {0}\t{1}", e.Name, e.Text);
    }
    private static void Serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
    {
        Console.WriteLine("Unknown Attributes: {0}\t{1}", e.Attr.Name, e.Attr.Value);
    }
    public Stream GenerateStreamFromString(string s)
    {
        var stream = new MemoryStream();
        var writer = new StreamWriter(stream);
        writer.Write(s);
        writer.Flush();
        stream.Position = 0;
        return stream;
    }
}

模型類是:

[XmlRoot(ElementName = "ConnectedChannels")]
public class ConnectedChannels
{
    [XmlElement(ElementName = "ConnectedChannel")]
    public List<string> ConnectedChannel { get; set; }
}

[XmlRoot(ElementName = "PairedEndpoint")]
public class PairedEndpoint
{
    [XmlElement(ElementName = "ConnectedChannels")]
    public ConnectedChannels ConnectedChannels { get; set; }
}

[XmlRoot(ElementName = "PairedEndpoints")]
public class PairedEndpoints
{
    [XmlElement(ElementName = "PairedEndpoint")]
    public List<PairedEndpoint> PairedEndpoint { get; set; }
}

[XmlRoot(ElementName = "EndpointInfo")]
public class EndpointInfo
{
    [XmlElement(ElementName = "PairedEndpoints")]
    public PairedEndpoints PairedEndpoints { get; set; }
}

[XmlRoot(ElementName = "ArrayOfEndpointInfo")]
public class ArrayOfEndpointInfo
{
    [XmlElement(ElementName = "EndpointInfo")]
    public EndpointInfo EndpointInfo { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM