Как сериализовать словарь <string, string> через WCF? - PullRequest
21 голосов
/ 02 октября 2009

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

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

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

Ответы [ 3 ]

24 голосов
/ 02 октября 2009

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

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

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

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

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

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

5 голосов
/ 02 октября 2009

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

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

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

1 голос
/ 30 января 2016

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

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

c # код

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)
        {

        }
    }

JSCode

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) {
    },
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...