【发布时间】:2011-03-27 12:23:57
【问题描述】:
我在使用DataContracts 反序列化列表包装器增加了额外数据的位置时遇到了问题。 XML 的重要部分粘贴在此处,本文末尾附有 XSD 和文档的完整链接。
<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 反序列化它时,我得到了预期的列表,只有 SearchResultsCriteria 上的 Matches 的所有值都为 0。我错过了什么让扩充列表正确反序列化?我发现 this msdn article 帮助我解决了一些其他问题,但没有关于这个特定问题的任何信息。
编辑:顺序很重要!
我在使用DataContract 反序列化时遇到了this other msdn article 关于XML 中元素顺序的问题。因此,据我所知,问题似乎在于无法确定顺序,因为在条件匹配之上有可变数量的 <criterion> 元素。我希望我可以将条件匹配的顺序指定为 1,并且当仅指定 1 个条件时它会起作用,因为我可以忍受这种情况。但是,正如我在上面指定的那样,当使用 CollectionDataContract 指定类时,这似乎不起作用。
对于更具体的上下文,我正在尝试为thrustcurve.org api 编写服务包装器。
【问题讨论】:
标签: c# serialization xml-serialization datacontract