0

この投稿を短く簡潔にするために最善を尽くします。コードを追加するために何度も編集する必要がある場合は、事前にお詫び申し上げます。

問題

XMLに正しくシリアル化できるクラスがあります。このクラスは、XML応答を返すWebサービスに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の後にブレークポイントを設定すると、リストオブジェクトを除くすべてのフィールドが設定されていることが示されます。

メソッドの開始時にnullに設定することで、orderRespオブジェクトをインスタンス化しました。また、そのクラスに含まれるオブジェクトのすべてのインスタンスをインスタンス化しましたが、どちらも結果はありません。

クラスからすべてのコレクション(リスト、配列など)を削除すると、XMLファイルの最初の応答を逆シリアル化できます。後続の応答は逆シリアル化されず、スキップされます。

他のアイデアはありますか?誰?

4

1 に答える 1

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
}
于 2012-08-01T20:04:10.983 に答える