Xml反序列化不是绑定列表

问题描述 投票:0回答:1

我有一个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个元素。

而且我不确定qazxsw poi末尾的“gxNg面具”是否意味着什么......响应背后的人不知道它是什么。

c# xml datacontractserializer xml-deserialization
1个回答
0
投票

<d3p1:KeyValuePairOfStringDatagxNgnmsk>末尾的“gxNgnmsk”是导致问题的原因。 <d3p1:KeyValuePairOfStringDatagxNgnmsk>解释了这个后缀的存在:

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

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

哈兹是Data Contract Names for Generic Types。如果我使用你的类从内存中创建的实例生成XML,我得到一个不同的哈希:

"gxNgnmsk"

显然你的<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,导致生成不一致的哈希。 (并且,从实验来看,namespace"http://schemas.datacontract.org/2004/07/System.Collections.Generic"以及"http://schemas.datacontract.org/2004/07/a"似乎都没有生成正确的哈希。可能我可以从完整的XML样本中猜出正确的命名空间,但是提供的简化XML中没有足够的信息。)

那么,可以做些什么来解决这个问题呢?

  1. 您可以获得“响应后面的一个”来告诉您所有合同类型(包括"")的正确数据协定名称和命名空间。无论如何,这对于Data通过网络发送数据是必要的,因此他们应该能够提供这些信息。
  2. 如果“响应背后的一个”提供了一个WSDL(他们应该),那么你应该能够使用data contract equivalence
  3. 但是在没有上述内容的情况下,您可以通过使用自定义auto-generate a client创建一个集合来解决此问题,其中散列为: collection data contract 使用此版本的[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。
© www.soinside.com 2019 - 2024. All rights reserved.