Десериализация XML в объект со списком в С#

Я хочу десериализовать XML в объект на С#, объект имеет одно строковое свойство и список других объектов. Есть классы, которые описывают объект XML, мой код не работает (ниже, XML в конце поста). Мой код Deserialize не возвращает никакого объекта.

Я думаю, что я делаю что-то не так с атрибутами, не могли бы вы проверить это и дать мне совет, как это исправить. Спасибо за вашу помощь.

[XmlRoot("shepherd")]
public class Shepherd
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlArray(ElementName = "sheeps", IsNullable = true)]
    [XmlArrayItem(ElementName = "sheep")]
    public List<Sheep> Sheeps { get; set; }
}

public class Sheep
{
    [XmlElement("colour")]
    public string colour { get; set; }
}

Существует код C# для десериализации XML в объекты.

        var rootNode = new XmlRootAttribute();
        rootNode.ElementName = "createShepherdRequest";
        rootNode.Namespace = "http://www.sheeps.pl/webapi/1_0";
        rootNode.IsNullable = true;

        Type deserializeType = typeof(Shepherd[]);
        var serializer = new XmlSerializer(deserializeType, rootNode);

        using (Stream xmlStream = new MemoryStream())
        {
            doc.Save(xmlStream);

            var result = serializer.Deserialize(xmlStream);
            return result as Shepherd[];
        }

Есть пример XML, который я хочу десериализовать

<?xml version="1.0" encoding="utf-8"?>
<createShepherdRequest xmlns="http://www.sheeps.pl/webapi/1_0">
  <shepherd>
    <name>name1</name>
    <sheeps>
      <sheep>
        <colour>colour1</colour>
      </sheep>
      <sheep>
        <colour>colour2</colour>
      </sheep>
      <sheep>
        <colour>colour3</colour>
      </sheep>
    </sheeps>
  </shepherd>
</createShepherdRequest>

person Jacek    schedule 21.09.2014    source источник


Ответы (1)


XmlRootAttribute не меняет имя тега при использовании в качестве элемента. Сериализатор ожидает <Shepherd>, но вместо этого находит <shepherd>. (XmlAttributeOverrides, похоже, тоже не работает с массивами.) Один из способов исправить это - изменить регистр самого имени класса:

public class shepherd
{
    // ...
}

Более простой альтернативой жонглированию атрибутами является создание правильного класса-оболочки:

[XmlRoot("createShepherdRequest", Namespace = "http://www.sheeps.pl/webapi/1_0")]
public class CreateShepherdRequest
{
    [XmlElement("shepherd")]
    public Shepherd Shepherd { get; set; }
}
person Markus Jarderot    schedule 21.09.2014