0

List を返す MVC Web API があります。クライアントに返される XML は次のようになります。

<ArrayOfLeadChange xmlns="The-namespace">
<LeadChange>
...
<LeadChange>
<ArrayOfLeadChange>

クラス LeadChange をクライアントにコピーし、xml をリストに逆シリアル化しようとしましたが、xml に「予期しない」エラーがあるという例外が発生しました。

クライアント側でオブジェクトを操作できるように、Get または Deserialize する良い方法はありますか?

4

2 に答える 2

2

への参照を追加しますSystem.Net.Http.Formatting- これは Web API の一部ですが、クライアントに Web API アセンブリがインストールされていない場合は、Nuget からクライアント ビットのみを取得できます - http://nuget.org/packages/Microsoft.AspNet.WebApi .Client/4.0.20710.0

PM> Install-Package Microsoft.AspNet.WebApi.Client -Version 4.0.20710.0

次に、Web API から取得し、 http://msdn.microsoft.com/en-us/library/hh944541(v ReadAsAsync<T>= vs.108 ).aspx を使用して逆シリアル化できます。

例えば:

var myobjects = Request.Content.ReadAsAsync<List<LeadChange>>().Result;
于 2013-01-09T03:19:50.213 に答える
1

手動でデシリアライズすることがユース ケースの正しいパスかどうかはわかりません。しかし、万能の優れた XML デシリアライザーが必要な場合は、これを試してください。

編集:これは、コレクションを返すための正しい関数です。

    /// <summary>
    /// Converts an XDoc into a List<T> of entities
    /// </summary>
    /// <typeparam name="T">Any serializable object</typeparam>
    /// <param name="doc"></param>
    /// <returns></returns>
    public static List<T> DeserializeCollection<T>(XDocument doc)
    {
        if (doc == null)
            return null;

        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
            XmlReader reader = doc.CreateReader();
            List<T> result = (List<T>)serializer.Deserialize(reader);
            reader.Close();
            return result;
        }
        catch (Exception e)
        {
            Logging.Log(Severity.Error, "Unable to deserialize document.", e);
            return null;
        }

    }

<ArrayOfノードに名前空間がある理由がわかりません。削除してみてください。それはうまくいくはずです。リストをこの関数にフィードして、「正しい」/「期待される」XML がどうあるべきかを確認することもできます。

    /// <summary>
    /// Converts a List<T> of entities into an XDoc.
    /// </summary>
    /// <typeparam name="T">Any serializable object</typeparam>
    /// <param name="doc"></param>
    /// <param name="paramList"></param>
    public static XDocument SerializeCollection<T>(List<T> paramList)
    {
        if (paramList == null)
            return null;

        XDocument doc = new XDocument();

        try
        {
            XmlSerializer serializer = new XmlSerializer(paramList.GetType());
            XmlWriter writer = doc.CreateWriter();
            serializer.Serialize(writer, paramList);
            writer.Close();
            return doc;
        }
        catch (Exception e)
        {
            Logging.Log(Severity.Error, "Unable to serialize list", e);
            return null;
        }

    }
}
于 2013-01-08T17:42:29.477 に答える