XML PortableRest 和 tvdb.com API 响应的反序列化器问题

XML Deserializer issues with PortableRest and tvdb.com API response

我只是尝试使用来自 tvdb.com 调用此 url: http://thetvdb.com/api/GetSeries.php?&seriesname=Homeland 的 REST api 调用的响应,这给了我这个 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 和 return 我的 类 的对象。在引擎盖下,PortableRest 使用 DataContractSerializer,它以某种方式在将此 XML 正确反序列化到我的对象时遇到问题。我相信我错过了一些属性,有人知道吗?这就是结果……看起来很奇怪。内容 属性 来自异步结果。

这些是我的 类:

[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);

谢谢!

这里的问题是您的 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 property. Data contracts are sensitive to order 的使用,因此有必要通知序列化程序子 XML 元素出现的顺序。