我只是尝试使用来自tvdb.com的REST api调用的响应来调用此url:http://thetvdb.com/api/GetSeries.php?&seriesname=Homeland,它给了我这个XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Data>
<Series>
<seriesid>247897</seriesid>
<SeriesName>Homeland</SeriesName>
</Series>
<Series>
<seriesid>84450</seriesid>
<SeriesName>Homeland Security USA</SeriesName>
</Series>
</Data>
我想使用具有通用异步方法的PortableRest库来调用url并返回我的类的对象。在引擎盖下,PortableRest使用 DataContractSerializer ,它在某种程度上将此XML正确反序列化到我的对象时出现问题。我相信我错过了一些属性,任何人都有想法?这就是结果......看起来很奇怪。 Content属性来自异步结果。
这些是我的课程:
[DataContract(Namespace = "")]
public class Data
{
[DataMember]
public IEnumerable<Series> Series { get; set; }
}
[DataContract(Namespace = "")]
public class Series
{
[DataMember(Name = "SeriesName")]
public string SeriesName { get; set; }
[DataMember(Name = "seriesid")]
public string SeriesId { get; set; }
}
var data = await restClient.SendAsync<Data>(request);
谢谢!
答案 0 :(得分:1)
此处的问题是,您的Series
列表采用的是单级格式而不是两级格式,但DataContractSerializer
不支持列表的单级格式。相反,它只支持两级格式,如下所示:
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Series>
<Series>
<seriesid>247897</seriesid>
<SeriesName>Homeland</SeriesName>
</Series>
<Series>
...
</Series>
</Series>
</Data>
因此,您需要使用以下类反序列化XML:
[CollectionDataContract(Name="Data", Namespace="")]
public class SeriesList : List<Series>
{
}
[DataContract(Namespace = "")]
public class Series
{
[DataMember(Name = "seriesid", Order=0)]
public string SeriesId { get; set; }
[DataMember(Name = "SeriesName", Order=1)]
public string SeriesName { get; set; }
}
并使用它:
var list = await restClient.SendAsync<SeriesList>(request);
var data = new Data { Series = list.ToList() };
顺便提一下,请注意DataMemberAttribute.Order
属性的使用。数据协定为sensitive to order,因此有必要通知序列化程序子XML元素的显示顺序。