从控制台应用程序,我调用Web API。 API以XML格式返回IEnumerable<Foo>
。 XML响应如下所示:
<ArrayOfFoo xmlns:i="..." xmlns="....">
<Foo>
<Member1>First Foo</Member1>
<Member2>Yes</Member2>
...
</Foo>
<Foo>
...
</Foo>
</ArrayOfFoo>
当我尝试在控制台应用中将其反序列化为List<Foo>
时,它无法正常工作。报告的例外是:
<ArrayOfFoo xmlns='http://schemas.datacontract.org/2004/07/TheFooThing.Model'>
不是预期的。
这是我用来反序列化响应的代码:
string xml;
using(var reader = new StreamReader(responseStream))
{
xml = reader.ReadToEnd();
}
// deserialize into shape IEnumerable<T>
var listOfFoos = new List<Foo>();
var resultType = listOfFoos.GetType();
var serializer = new XmlSerializer(resultType);
var doc = XDocument.Parse(xml);
using(var reader = doc.CreateReader())
{
listOfFoos = serializer.Deserialize(reader) as List<Foo>;
}
return listOfFoos;
注意:我使用旧HttpWebRequest
发出HTTP请求并从API获取响应。没有特别的理由选择此而不是选择HTTPClient
。
答案 0 :(得分:0)
看起来这是DataContractSerializer
而不是XmlSerializer
生成的。前者使用http://schemas.datacontract.org/2004/07/Clr.Namespace
作为其默认名称空间,而XmlSerializer
默认情况下不指定默认名称空间。您可以切换到DataContractSerializer
,或将正确的默认命名空间传递给XmlSerializer
constructor:
string xml;
using(var reader = new StreamReader(responseStream))
{
xml = reader.ReadToEnd();
}
var serializer = new XmlSerializer(typeof(List<Foo>), "http://schemas.datacontract.org/2004/07/TheFooThing.Model");
using (var reader = new StringReader(xml))
{
var listOfFoos = serializer.Deserialize(reader) as List<Foo>;
return listOfFoos;
}