0

我有一个返回 List 的 MVC web api 返回给客户端的 XML 是这样的:

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

我已将 LeadChange 类复制到客户端并尝试将 xml 反序列化为 List,但我得到一个异常,即 xml 中存在错误“意外”

有没有一种获取或反序列化的好方法,以便我可以在客户端使用对象?

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 获取并使用反序列化ReadAsAsync<T>- http://msdn.microsoft.com/en-us/library/hh944541(v=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 回答