在客户端上反序列化mvc web api c# xml
本文关键字:api xml web mvc 客户端 反序列化 | 更新日期: 2023-09-27 17:50:58
我有一个MVC web api返回列表返回给客户机的XML如下所示:
<ArrayOfLeadChange xmlns="The-namespace">
<LeadChange>
...
<LeadChange>
<ArrayOfLeadChange>
我已经将类LeadChange复制到客户端,并尝试将xml反序列化到列表,但我得到一个异常,即xml"意外"中有错误
是否有一种很好的方法来获取或反序列化,以便我可以在客户端使用对象?
添加对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;
我不确定手动反序列化是否是您用例的正确路径。但是,如果您想要一个好的、全面的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
节点有一个命名空间。试着把它去掉。这应该行得通。您还可以将List输入该函数,以查看"正确的"/"期望的"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;
}
}
}