繁体   English   中英

XML反序列化不绑定列表

[英]Xml deserialization not binding list

我有一个看起来像这样的XML文件:

<Stamdata xmlns="http://schemas.datacontract.org/2004/07/a">
  <Liste xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
    <d3p1:KeyValuePairOfStringDatagxNgnmsk>
      <d3p1:key>key value</d3p1:key>
      <d3p1:value>
        ......
      </d3p1:value>
    </d3p1:KeyValuePairOfStringDatagxNgnmsk>
  </Liste>
</Stamdata>

我的任何模特看起来像

[DataContract(Name = "Stamdata", Namespace = "http://schemas.datacontract.org/2004/07/a")]
public class Stamdata
{
   [DataMember]
   public KeyValuePair<string, Data>[] Liste { get; set; }
}

[DataContract(Name = "Data", Namespace = "http://schemas.datacontract.org/2004/07/System.Collections.Generic")]
public class Data
{
   //.... Many properties
}

我的问题是该列表始终包含0个元素,甚至认为xml包含大约100个元素。

而且我不确定<d3p1:KeyValuePairOfStringDatagxNgnmsk>末尾的“ gxNgnmsk”是什么意思...响应背后的那个不知道它是什么。

<d3p1:KeyValuePairOfStringDatagxNgnmsk>末尾的“ gxNgnmsk”是导致问题的原因。 通用类型的数据合同名称中解释了此后缀的存在:

存在用于确定泛型类型的数据协定名称的特殊规则。

默认情况下,泛型类型的数据协定名称是该类型的名称,后跟字符串“ Of”,然后是泛型参数的数据协定名称, 然后是使用泛型的数据协定名称空间计算得出的哈希参数。 ...当所有通用参数都是基本类型时,将省略哈希。

"gxNgnmsk"是哈希。 而且,如果我使用您的类从内存中创建的实例生成XML,则会得到不同的哈希值:

<Stamdata xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/a">
  <Liste xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
    <d2p1:KeyValuePairOfstringDatatwCi8m_S7>
      <d2p1:key>key value</d2p1:key>
      <d2p1:value />
    </d2p1:KeyValuePairOfstringDatatwCi8m_S7>
  </Liste>
</Stamdata>

显然,您的Data类型没有正确的数据协定名称空间 ,从而导致生成不一致的哈希。 (而且,根据实验, "http://schemas.datacontract.org/2004/07/System.Collections.Generic""http://schemas.datacontract.org/2004/07/a"""都不会出现生成正确的哈希值。可能我可以从完整的XML示例中猜出正确的名称空间,但提供的简化XML中没有足够的信息。)

那么,该如何解决呢?

  1. 您可以得到“响应背后的一个”,以告诉您所有合同类型(包括Data的正确数据合同名称和名称空间。 无论如何,当通过有线发送数据时,对于数据合同等效来说都是必需的,因此它们应该能够提供此信息。

  2. 如果“响应背后的一个”提供了WSDL(并且应该提供),则您应该能够自动生成一个可以正常工作的客户端

  3. 但是,如果没有上述方法,则可以通过使用自定义集合数据协定创建一个具有散列在其中的哈希的集合来解决此问题:

     [DataContract(Name = "Stamdata", Namespace = "http://schemas.datacontract.org/2004/07/a")] public class Stamdata { [DataMember] public DataList Liste { get; set; } } [CollectionDataContract( Namespace = "http://schemas.datacontract.org/2004/07/System.Collections.Generic", ItemName = "KeyValuePairOfStringDatagxNgnmsk")] public class DataList : List<KeyValuePair<string, Data>> { public DataList() : base() { } public DataList(IEnumerable<KeyValuePair<string, Data>> list) : base(list) { } } 

    使用此版本的Stamdata ,可以对示例XML进行反序列化,而无需知道Data的正确名称空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM