2011-03-27 29 views
1

我使用DataContract s到反序列化,其中一个列表包装与额外增加的数据有问题。 XML的重要部分粘贴在这里,在本文后面有完整的XSD链接和文档。的DataContractSerializer上增强列表类型

<criteria> 
    <criterion> 
    <name>common-name</name> 
    <value>J350</value> 
    <matches>3</matches> 
    </criterion> 
    <criterion> 
    <name>designation</name> 
    <value>J350</value> 
    <matches>8</matches> 
    </criterion> 
    <matches>2</matches> <!-- only shows results matching all criteria --> 
</criteria> 

我在现在的问题是:

[CollectionDataContract(Namespace = "TheNamespace")] 
public partial class SearchResultsCriteria : List<SearchResultsCriteriaInfo> 
{ 
    [DataMember(Name = "matches", Order = 1)] // fail 
    public int Matches { get; set; } 
} 

[DataContract(Name = "criterion", Namespace = "TheNamespace")] 
public partial class SearchResultsCriteriaInfo 
{ 
    [DataMember(Name = "name", Order = 0)] 
    public string Name { get; set; } 

    [DataMember(Name = "value", Order = 1)] 
    public string Value { get; set; } 

    [DataMember(Name = "matches", Order = 2)] 
    public int Matches { get; set; } 

    // all other properties which can show up in the xml 
} 

现在的问题,当我反序列化这个使用DataContractSerializer,我得到的预期,只有所有的值的MatchesSearchResultsCriteria列表通过为0. 我错过了什么让增强列表正确反序列化?我发现this msdn article帮助我解决了一些其他问题,但没有关于这个特定问题的任何信息。

编辑:为了事宜!

我在使用DataContract反序列化时遇到了有关XML中元素顺序的this other msdn article。因此,从我所知道的情况看,问题似乎是订单无法确定,因为在标准匹配上方存在可变数量的<criterion>元素。我希望能够确定标准匹配的顺序为1,并且只有一个标准被指定时,它才会起作用,因为我可以忍受这种情况。但是,如果我按照上面的规定在CollectionDataContract中指定课程,那么这似乎不起作用。

对于更具体的方面,我试图写的thrustcurve.org api服务包装。

回答

1

我不确定“扩充列表类型”究竟是什么意思,但我将假设您指的是未归类为DataMember属性但仍然需要在序列化过程。

基于这样的认识,你需要的是IExtensibleDataObject。 http://msdn.microsoft.com/en-us/library/ms731083.aspxhttp://msdn.microsoft.com/en-us/library/ms731138.aspxhttp://msdn.microsoft.com/en-us/library/system.runtime.serialization.iextensibledataobject.aspx将是很好的起点。

如果我误解你的问题...对不起!请确定你的意思。

+0

我标志着这个答案是正确的,因为你可以用'IExtensibleDataObject'做到这一点,但它是不可能的POCO的对象,所以我结束了使用XML序列化我的项目来代替。 – 2011-04-27 14:39:39