XMLSerializer is not correctly deserializing XML for a property of type List

c#, xml-serialization

Solution

The problem is that what you have declared doesn't actually match your XML. If you serialize an object from your current declaration, you get:

<?xml version="1.0" encoding="utf-16"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Clients>
    <ID>1</ID>
    <Name>John</Name>
    <Age>25</Age>
    <Address>Some address</Address>
  </Clients>
</Response>

Try:

[XmlRoot("Response")]
public class MyClients
{
    [XmlArray("Clients")]
    [XmlArrayItem("Client")]
    public List<MyClient> Clients { get; set; }
}

[XmlRoot("Client")]
public class MyClient
{
    [XmlElement("ID")]
    public int ID;
    [XmlElement("Name")]
    public string Name;
    [XmlElement("Age")]
    public int Age;
    [XmlElement("Address")]
    public string Address;
}

Which produces:

<?xml version="1.0" encoding="utf-16"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Clients>
    <Client>
      <ID>1</ID>
      <Name>John</Name>
      <Age>25</Age>
      <Address>Some address</Address>
    </Client>
  </Clients>
</Response>

Problem

I get an XML type data, such as this; ``` <Response> <Clients> <Client> <ID>1</ID> <Name>John</Name> <Age>25</Age> <Address>Some address</Address> </Client> <Client> <ID>2</ID> <Name>Mark</Name> <Age>22</Age> <Address>Some address2</Address> </Client> <Client> <ID>3</ID> <Name>Phil</Name> <Age>30</Age> <Address>Some address3</Address> </Client> </Clients> </Response> ``` In C# I have the following code: ``` [XmlRoot("Response")] public class MyClients { [XmlElement("Clients", typeof(MyClient))] public List<MyClient> Clients { get; set; } } public class MyClient { [XmlElement("ID")] public int ID; [XmlElement("Name")] public string Name; [XmlElement("Age")] public int Age; [XmlElement("Address")] public string Address; } ``` and I try to get this data, using ``` public ActionResult GetClients() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("someUrl"); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); XmlSerializer serializer = new XmlSerializer(typeof(WFMClientsList)); Stream receiveStream = response.GetResponseStream(); WFMClientsList clients = (MyClients)serializer.Deserialize(receiveStream); } ``` but I get nothing in response. Can anyone explain how to deserialize XML to `List<MyClient>` correctly?

Original source