Я постараюсь сделать этот пост коротким и лаконичным. Заранее извиняюсь, если мне нужно внести ряд правок для добавления кода.
Проблема
У меня есть класс, который я могу правильно сериализовать в 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, последующие ответы не десериализуются и пропускаются.
Любые другие идеи? Кто угодно?