"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 недостаточно информации.)
Итак, что можно сделать, чтобы это исправить?
Вы можете получить «ответ за ответ», чтобы сообщить вам правильное имя контракта данных и пространство имен для всех типов контрактов, включая Data
. В любом случае это необходимо для эквивалентности контракта данных при отправке данных по проводам, чтобы они могли предоставить эту информацию.
Если «ответ за ответом» предоставляет WSDL (и они должны это сделать), вы сможете автоматически сгенерировать клиента , который должен просто работать.
Но при отсутствии вышесказанного вы можете обойти эту проблему, создав коллекцию с пользовательским контрактом для сбора данных с хэшем, запеченным в:
[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
.