Как вы получаете сериализацию WCF, чтобы сохранить не по умолчанию Comparer в универсальном словаре? - PullRequest
2 голосов
/ 15 ноября 2011

Предположим, мы начинаем с нуля в Visual Studio 2010 и добавляем «Приложение службы WCF».Мы добавляем этот метод и реализацию:

// (in IService1.cs)
    [OperationContract]
    Dictionary<string, string> GetDictionary();

// (in Service1.svc.cs)
    public Dictionary<string, string> GetDictionary()
    {
        return new Dictionary<string, string>(
            StringComparer.InvariantCultureIgnoreCase);
    }

Затем мы добавляем новое «Консольное приложение» к тому же решению, добавляем Сервисную ссылку в наш сервисный проект (используя все настройки по умолчанию) и добавляем этот кодв Main:

        var c = new ServiceReference1.Service1Client();

        var d = c.GetDictionary();

        d.Add("key",string.Empty);
        // Since this *should* be a case-insensitive dictionary,
        // this add *should* fail
        d.Add("KEY", string.Empty);

        Console.WriteLine("Both Add()s succeeded :(");
        Console.ReadKey();

Мы ожидаем, что этот код перестанет работать, поскольку словарь без учета регистра будет рассматривать key и KEY как один и тот же ключ, и поэтому будет выбрасывать второй Add.

К сожалению, когда все скомпилировано и запущено, мы получаем печальное лицо :(, потому что, когда Dictionary попадает на слой WCF, он «забывает», что он был сделан с определенным,не по умолчанию, Comparer, и вместо этого получает string s средство сравнения по умолчанию.

Существует ли простая настройка, которую можно изменить, чтобы сохранить свойство Comparer Dictionaryкак проходит по проводам?Или я должен создать собственный класс?

(я видел XML сериализацию словаря с пользовательским IEqualityComparer , но он не дал мне особого понимания.также видел этот комментарий к проекту от 3 лет назад , но это мой вопрос, а не ответ)

1 Ответ

6 голосов
/ 15 ноября 2011

Если вы используете стандартный механизм, такой как «Добавить ссылку на службу» и т. Д., WCF по проекту создаст полностью отдельную копию ваших структур данных на основе структура на проводе, например, XML-сериализованная структура , которая может быть выражена в XML-схеме (XSD).

Это не включает в себя все, что более поведение (код), а не фактические данные - такие как компараторы и т. Д.

Нет настройки для "включения" этого - простоне может быть сделаноЕдинственный способ решить эту проблему - когда вы контролируете оба конца коммуникационного провода, и оба они являются платформами .NET - это поделиться , что необходимо обеим сторонам (контракты на обслуживание, контракты на передачу данных и т. Д.) Вотдельная сборка, на которую как сервер, так и клиент ссылаются.На клиенте вы должны убедиться, что добавили ссылку на эту общую сборку до создания прокси WCF - в этом случае среда выполнения WCF будет повторно использовать существующие структуры данных (например, ваш словарь с пользовательским компаратором).) из общей сборки вместо создания новых копий.

...