Десериализовать массив в сложный объект - PullRequest
3 голосов
/ 25 января 2011

Мое XML-сообщение выглядит так:

<msg>
    <reply userid="sales" requestid="2" index="1" pagesize="1000" total="1" type="order">
        <order id="12db8625cd4-000" owner="sales">
            <qty size="1" working="0"/>
            <price limit="0.0"/>
        </order>            
        <order id="12db8636344-000" owner="sales">
            <qty size="1000" working="0"/>
            <price limit="0.0"/>
        </order>
    </reply>
</msg>

Как определить объект Order для чтения из массива ответов?Мои объекты выглядят так:

[XmlRootAttribute("reply")]
public class MessageReply
{
    [XmlAttribute("userid")]
    public string UserId { get; set; }

    [XmlAttribute("requestid")]
    public string RequestId { get; set; }

    [XmlAttribute("type")]
    public string Type { get; set; }

    [XmlArrayItem(typeof(Order))]
    public List<Order> Orders { get; set; }
}

[XmlRootAttribute("order")]
public class Order
{
    [XmlAttribute("id")]
    public string Id { get; set; }
    [XmlAttribute("owner")]
    public string Owner { get; set;}
    [XmlAttribute("assignee")]
    public string Assignee { get; set; }
    [XmlAttribute("instrumentid")]
    public string InstrumentId { get; set; }
    [XmlAttribute("side")]
    public string Side { get; set;}
    [XmlAttribute("type")]
    public string Type { get; set; }
}

В моем случае ордера должны быть в отдельном элементе тега Orders.Я хочу прочитать их из элемента ответа.У вас есть идеи, что изменить в моих объектах атрибуты XML?

1 Ответ

5 голосов
/ 25 января 2011

Изменение:

[XmlArrayItem(typeof(Order))]
public List<Order> Orders { get; set; }

до:

[XmlElement("order")]
public List<Order> Orders { get; set; }

хорошо ... строго говоря, я бы склонен (мне не нравятся настраиваемые списки) использовать:

private List<Order> orders;
[XmlElement("order")]
public List<Order> Orders {get{ return orders ?? (orders = new List<Order>());}}

Вам также нужен другой корневой объект:

[XmlRoot("msg")]
public class Message
{
    [XmlElement("reply")]
    public MessageReply Reply { get; set; }
}

Тогда это работает:

var ser = new XmlSerializer(typeof(Message));
MessageReply reply;
using(var reader = new StringReader(xml))
{
    reply = ((Message)ser.Deserialize(reader)).Reply;
}
...