XML Deserializer与PortableRest和tvdb.com API响应有关

时间:2015-02-17 23:27:48

标签: c# xml datacontractserializer

我只是尝试使用来自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属性来自异步结果。

The problem

这些是我的课程:

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

谢谢!

1 个答案:

答案 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元素的显示顺序。