десериализация XML приводит к отсутствию данных ни для каких элементов последовательности

Я постараюсь сделать этот пост коротким и лаконичным. Заранее извиняюсь, если мне нужно внести ряд правок для добавления кода.

Проблема

У меня есть класс, который я могу правильно сериализовать в XML. Класс отправляет XML в веб-службу, которая возвращает ответ в формате XML. Затем XML-ответ десериализуется в объекты для дополнительной обработки. Я могу правильно десериализовать свои объекты, при условии, что возвращаемый XML не является последовательностью

Что я пробовал

Я создал свой класс, чтобы он выглядел так:

[other class declarations here to support XML response]

public class OrderInfoListResponse
{
    public List<OrderInfo> OrderInfo { get; set; }

    public OrderInfoListResponse()
    {
        OrderInfo = new List<OrderInfo>();
    }
}

Десериализатор выглядит так:

using (Stream respStream = response.GetResponseStream())
{
    XmlSerializer serializer = new XmlSerializer(typeof(OrderListResponse));
    orderResp = serializer.Deserialize(respStream) as OrderListResponse;
}

Если я передам данные, которые выглядят так:

 <ResponseBody>
    <PageInfo>
       <TotalCount>51</TotalCount>
       <TotalPageCount>6</TotalPageCount>
       <PageSize>10</PageSize>
       <PageIndex>1</PageIndex>
 </PageInfo>
 <RequestID>4546ASDDAS54</RequestID>
 <OrderInfoList>
        <OrderInfo>
            <SellerID>XXXX</SellerID>
            <OrderNumber>111111111</OrderNumber>
            <InvoiceNumber>222222</InvoiceNumber>
            ....
        </OrderInfo>
 <OrderInfoList> 

Я могу получить данные PageInfo и RequestID без проблем, но мой результирующий объект показывает

OrderInfoList
    OrderInfo count = 0

Если я покажу ответ в виде строки, я получу 51 ответ.

Вопрос

Почему я не могу десериализоваться в OrderInfo?

Что я пробовал

Я попробовал следующий код, но мой счет по-прежнему равен 0:

using (Stream respStream = response.GetResponseStream())
{
    StreamReader readerOK = new StreamReader(respStream);
    string resp = @readerOK.ReadToEnd();
    var myEncoder = new ASCIIEncoding();
    var bytes = myEncoder.GetBytes(resp);
    var memoryStream = new MemoryStream(bytes);
    var xmlSerializer = new XmlSerializer(typeof(OrderListResponse));
    orderResp = xmlSerializer.Deserialize(memoryStream) as OrderListResponse;
 }

Установка точки останова на myEncoder показывает, что строка resp содержит полный XML-ответ, установка точки останова после того, как orderResp показывает, что все поля установлены, за исключением объектов списка.

Я создал экземпляр своего объекта orderResp, установив для него значение null в начале метода. Я также создал экземпляр каждого экземпляра объекта, содержащегося в этом классе, но безрезультатно.

Если я удаляю все коллекции (списки, массивы и т. д.) из классов, я могу десериализовать первый ответ в файле XML, последующие ответы не десериализуются и пропускаются.

Любые другие идеи? Кто угодно?


person Robert H    schedule 31.07.2012    source источник
comment
Только что отредактировал свой ответ...   -  person Forty-Two    schedule 01.08.2012


Ответы (1)


Проблема заключалась в том, как был создан класс.

Исходный класс выглядел так:

открытый класс OrderListResponseBody {

    public PageInfo PageInfo { get; set; }  
    public string RequestID { get; set; }  
    public string RequestDate { get; set; } 
    public List<OrderInfoListResponse> OrderInfoList { get; set; }  
}

Новый класс выглядит так:

public class OrderListResponseBody
{

    public PageInfo PageInfo { get; set; }  
    public string RequestID { get; set; }  
    public string RequestDate { get; set; } 
    public List<OrderInfo> OrderInfoList { get; set; }  <!-- notice the change
}
person Robert H    schedule 01.08.2012