WCF странная сериализация ReadOnlyDictionary

#c# #wcf #serialization

#c# #wcf #сериализация

Вопрос:

Я использую ссылку на службу WCF (wsdl генерируется на стороне клиента), которая предоставляет функцию API с объектом [DataContract], который содержит словарь [DataMember] <string,DateTime> типа. Объект выглядит одинаково как на клиенте, так и на сервере, и сегодня он используется во многих местах как на стороне клиента, так и на стороне сервера.

Я хотел сделать объект неизменяемым и, следовательно, изменил все его поля типа значения, чтобы иметь частный установщик, а словарь — на тип ReadOnlyDictionary<строка, дата-время> . На стороне сервера все в порядке — это гарантирует, что никто не сможет изменить словарь, но когда я обновил ссылку на службу с клиента, у нее сгенерирован странный тип — вот как это выглядит в reference.cs:

 [System.Runtime.Serialization.DataMemberAttribute()]
public SampleClient.RateDataService.ReadOnlyDictionaryOfstringdateTime Timestamps {
    get {
        return this.TimestampsField;
    }
    set {
        if ((object.ReferenceEquals(this.TimestampsField, value) != true)) {
            this.TimestampsField = value;
            this.RaisePropertyChanged("Timestamps");
        }
    }
}
  

Итак, на стороне клиента это на самом деле странный объект типа «ReadOnlyDictionaryOfstringdateTime», который содержит элемент с именем «m_dictionary», который имеет тип Dictionary<string,DateTime> и, таким образом, это поле больше не является неизменяемым. Почему WCF не будет использовать тот же тип на стороне клиента? Есть ли способ заставить его сериализоваться в ReadOnlyDictionary?

Ответ №1:

Чтобы объяснить это, нам нужно выполнить создание кода на стороне клиента с использованием WCF. Это не волшебная операция, но она выполняется поэтапно.

Когда вы добавляете ссылку на WCF (или любой другой тип службы SOAP), вы фактически загружаете файл WSDL, и автоматически созданный код привязывается к этому файлу. WSDL@w3schools

WSDL расшифровывается как язык описания веб-служб

WSDL используется для описания веб-сервисов

WSDL написан на XML

WSDL — это рекомендация W3C от 26. Июнь 2007

Тонкости создания WSDL и клиентского кода хорошо объяснены здесь

Потому что использование System.Коллекции.Вероятно, Generic.Dictionary означает, что вы знаете, что нет гарантии, что представление на стороне клиента будет возможно, если вы используете альтернативную платформу. Не существует способа осмысленно передать семантику класса словаря .NET с использованием WSDL / XSD.

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

Комментарии:

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