Подтвердить что ты не робот

Как сериализовать словарь <строка, строкa> через WCF?

У меня есть контракт данных с членом данных, набранным как Dictionary<string, string>.

Сгенерированная ссылка на веб-службу предоставляет это как элемент с типом ArrayOfKeyValueOfstringstringKeyValueOfstringstring[].

Кто-нибудь видел это раньше?

4b9b3361

Ответ 1

WCF только сериализует структуру, потому что то, что заканчивается на проводе, должно быть достаточно самодостаточным, чтобы быть полезным для любого клиента, а не только для клиентов .NET.

Некоторые клиенты, разработанные на другой платформе, могут не разделять понятия "словаря", поэтому это слишком сдерживает сериализацию словаря для представления, которое несет неявные знания о базовом классе.

Клиент может даже не быть объектно-ориентированным.

Словарь больше, чем структура - он также содержит поведение (например, когда вы назначаете ключ, который уже существует, вы перезаписываете этот ключ и т.д.), и это поведение не может перемещаться по проводу.

Другими словами, словари и многие другие типы .NET не совместимы, поэтому WCF не будет пытаться сохранить их в ServiceContract.

Вероятно, вам лучше разработать пользовательский DataContract для ваших данных.

Ответ 2

Поскольку WCF должен преобразовать все в XML, он должен соответствовать XML... Коллекции, как правило, преобразуются в массивы.

Словарь трудно представить как xml, поэтому у вас есть этот тип с другой стороны. Вы можете указать SvcUtil.exe для использования определенных коллекций вместо массивов в сгенерированном прокси-коде, но я не уверен, что он будет работать для Словаря. Я бы сказал, что вам следует избегать использования Словаря здесь и использовать более простую коллекцию.

Что бы я сделал, это создать свой собственный тип данных, [DataContract], сделать его двумя полями типа String, а затем создать коллекцию из них, которую вы заполняете все, что вы найдете в словаре. Затем отправили эту коллекцию через провод, а затем перевели обратно в словарь на другой стороне.

Ответ 3

Есть способ сделать это. Контракт операции - это фактически строка. Я избегаю строки json, чтобы сохранить строку. Затем я в веб-методе unescape строку и анализировать его в словаре, используя NewtonSoftJson Я использовал словарь, но вы также можете сделать словарь, если хотите. Надеюсь, это полезно...

Я использовал библиотеку NewtonSoft Json...

С# code

using Newtonsoft.Json;
[OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json)]
    public void testMethod(string jsonData)
    {
        string data = Uri.UnescapeDataString(jsonData);
        Dictionary<string, string> x = jsonConvert.DeserializeObject<Dictionary<string, string>>(data);
        foreach (KeyValuePair<string, string> kvp in x)
        {

        }
    }

ОАО

var Data = {
    width: 400,
    height: 200,
    someString: "somedata"
};

$.ajax({
    type: "POST",
    url: "Service1.svc/testMethod",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    timeout: 1000000,               
    data:  '{"jsonData": "' + escape(JSON.stringify(Data)) + '"}',
    error: function(error) {
    },
    success: function (data) {
    },
});