【问题标题】:Deserialize mvc web api c# xml on client在客户端反序列化 mvc web api c# xml
【发布时间】:2013-01-08 17:38:19
【问题描述】:

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

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

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

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

【问题讨论】:

  • 什么样的客户? Javascript? 。网?其他?
  • 客户端是一个 ASP.NET C# 应用程序

标签: c# asp.net serialization asp.net-web-api


【解决方案1】:

添加对 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&lt;T&gt; - http://msdn.microsoft.com/en-us/library/hh944541(v=vs.108).aspx 进行反序列化

例如:

var myobjects = Request.Content.ReadAsAsync<List<LeadChange>>().Result;

【讨论】:

    【解决方案2】:

    我不确定手动反序列化是否适合您的用例。但是,如果你想要一个好的全能 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;
            }
    
        }
    

    我不确定您为什么在 &lt;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;
            }
    
        }
    }
    

    【讨论】:

    • 这导致了同样的错误。 不是预期的。
    • 它会导致相同的异常。我将尝试删除根节点。
    • 对不起,我想我不清楚。您需要根节点,只需删除命名空间属性即可。
    • 您有机会试用代码吗?有什么问题可以帮你解决吗?
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多