Zwierzak
Zwierzak

Reputation: 686

XML Serialization / Deserialization of List in c#

I have such class structure:

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

I would like the resulting XML to look like this

<?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>

However, I don't really know how the PairedEndpoints should be serialized to create a list of channels inside of it. I would be grateful for any help.

Upvotes: 3

Views: 1764

Answers (2)

M. Nasir Javaid
M. Nasir Javaid

Reputation: 5990

You use XmlSerializer for this

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

The model classes are:

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

Upvotes: 0

Amit Kumar Ghosh
Amit Kumar Ghosh

Reputation: 3726

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

then:

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

Upvotes: 1

Related Questions