【问题标题】:DataContractSerializer on augmented list type增强列表类型上的 DataContractSerializer
【发布时间】: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 中元素顺序的问题。因此,据我所知,问题似乎在于无法确定顺序,因为在条件匹配之上有可变数量的 &lt;criterion&gt; 元素。我希望我可以将条件匹配的顺序指定为 1,并且当仅指定 1 个条件时它会起作用,因为我可以忍受这种情况。但是,正如我在上面指定的那样,当使用 CollectionDataContract 指定类时,这似乎不起作用。

对于更具体的上下文,我正在尝试为thrustcurve.org api 编写服务包装器。

【问题讨论】:

    标签: c# serialization xml-serialization datacontract


    【解决方案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 将是很好的起点。

    如果我误解了您的问题...对不起!请澄清你的意思。

    【讨论】:

    • 我将此答案标记为正确,因为您可以使用 IExtensibleDataObject 来完成此操作,但是 POCO 对象无法做到这一点,因此我最终为我的项目使用了 XML 序列化。
    猜你喜欢
    • 2021-02-06
    • 2019-02-18
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2014-12-18
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多