2

Web サービスから受信した XML 応答を逆シリアル化する際に問題が発生しています。応答は次のようになります。

<CreateSubscribersResultCollection xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <CreatedSubscriberIds xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <a:long>206464306</a:long>
        <a:long>306664316</a:long>
    </CreatedSubscriberIds>
    <FailedCreatedSubscribers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
</CreateSubscribersResultCollection>

XML を逆シリアル化するために使用するコードは次のようになります。

internal T GetQueuedResults<T>(string url)
{
    WebRequest request = GetRequestObject(url, "GET");
    var httpResponse = (HttpWebResponse)request.GetResponse();

    using (var responseStream = httpResponse.GetResponseStream())
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        var response = (T)xmlSerializer.Deserialize(responseStream);

        return response;
    }
}

逆シリアル化すると ( type を渡すCreateSubscribersResultCollection) 、エラーはまったく発生しません。代わりに、CreatedSubscriberIdsの長さは0. エラーがクラスの設計方法にあることは確かですが、エラーの原因がわかりCreateSubscribersResultCollectionません。クラスは次のようになります。

[DataContract]
public class CreateSubscribersResultCollection : RequestBase
{
    [XmlArray("CreatedSubscriberIds")]
    [XmlArrayItem(typeof(long))]
    public List<long> CreatedSubscriberIds { get; set; }

    [XmlElement("FailedCreatedSubscribers")]
    public string FailedCreatedSubscribers { get; set; }
}

クラスをインスタンス化してシリアル化すると、デバッグ目的で次の結果が得られます。

<CreateSubscribersResultCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <CreatedSubscriberIds>
        <long>206464306</long>
        <long>306664316</long>
    </CreatedSubscriberIds>
    <FailedCreatedSubscribers />
</CreateSubscribersResultCollection>

私が間違っていることを知っている誰かがそこにいることを願っています。私はこれに対してあまりにも長い間頭を悩ませてきましたが、Google は私を助けてくれませんでした.

4

2 に答える 2

2

次のように名前空間を指定してみてください。

    [DataContract]
public class CreateSubscribersResultCollection : RequestBase
{
    [XmlArray("CreatedSubscriberIds")]
    [XmlArrayItem(typeof(long), Namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")]
    public List<long> CreatedSubscriberIds { get; set; }

    [XmlElement("FailedCreatedSubscribers")]
    public string FailedCreatedSubscribers { get; set; }
}
于 2012-05-15T07:45:56.840 に答える
0

GetResponseStream()その中にデータがあることを確認してください。テストするには、ネットワーク接続を行う代わりに、これをファイルに保存してみてください。データファイルに保存して逆シリアル化します。連載ならそこが一番の勝負です。適切にシリアライズされていれば、デシリアライズは問題になりません。

于 2012-05-15T07:46:55.823 に答える