XML десериализация не обязательный список - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть 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.

И я не уверен, что "gxNgnmsk" в конце <d3p1:KeyValuePairOfStringDatagxNgnmsk> означает что-нибудь ... тот, кто стоит за ответом, не знает, что это такое.

1 Ответ

0 голосов
/ 03 сентября 2018

"gxNgnmsk" в конце <d3p1:KeyValuePairOfStringDatagxNgnmsk> является причиной вашей проблемы. Наличие этого суффикса объясняется в Имена контрактов данных для универсальных типов :

Существуют специальные правила для определения имен контрактов данных для универсальных типов ...

По умолчанию именем контракта данных для универсального типа является имя типа, за которым следует строка «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.

...