C#中的XML序列化/反序列化列表

3

我有这样的类结构:

 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以创建其中的通道列表。如果您能提供任何帮助,我将不胜感激。

2个回答

1

Try this :

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

0
你可以使用 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; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接