反序列化XML不会导致任何序列元素的数据

时间:2012-07-31 20:24:13

标签: c# deserialization xml-deserialization

我将尽力保持这篇文章简洁明了。如果我需要进行大量编辑来添加代码,我会提前道歉。

问题

我有一个类,我能够正确地序列化为XML。该类将XML发送到返回XML响应的Web服务。然后将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> 

我能够获得没有isses的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显示所有字段设置后设置断点,列表对象除外。

我已经通过在方法开头将其设置为null来实例化我的orderResp对象。我还实例化了该类中包含的对象的每个实例,两者都没有结果。

如果我从类中删除所有集合(列表,数组等),我可以反序列化XML文件中的第一个响应,后续响应不会反序列化并被跳过。

还有其他想法吗?任何人?

1 个答案:

答案 0 :(得分:0)

问题在于如何创建课程。

原来的课程看起来像:

公共类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
}