Есть ли другие причины, по которым я должен считать, что пропуск значения по умолчанию является плохой практикой? - PullRequest
4 голосов
/ 27 октября 2011

Я некоторое время работал с WCF и в местах, где как клиент, так и сервер имеют тенденцию к совместному выпуску;то есть новые версии почти всегда выпускались одновременно.Функциональная совместимость и управление версиями не являются проблемами (в данном случае, по крайней мере).

Документация MSDN, DataMemberAttribute.EmitDefaultValue и Управление версиями данных , предполагает, что это плохоПрактика для выдачи значения по умолчанию, если нет особой необходимости, и для поддержки управления версиями.

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

Существуют ли другие причины, по которым этого следует избегать?

1 Ответ

1 голос
/ 27 октября 2011

Я также использую DataMemberAttribute.EmitDefaultValue = false в некоторых местах, чтобы попытаться ограничить объем передаваемых данных. В моем случае я контролирую как клиентскую, так и серверную стороны, поэтому у меня нет проблем с этим.

Я нашел ссылку на потенциальный конфликт с DataMemberAttribute.IsRequired, о котором я раньше не знал:

Взаимодействие с IsRequired

... Если IsRequired установлен в true , (который указывает, что значение должно присутствовать) и EmitDefaultValue имеет значение false (что означает, что значение не должно присутствовать, если для него установлено значение по умолчанию), значения по умолчанию для этого элемент данных не может быть сериализован, потому что результаты будут противоречат друг другу. Если для такого элемента данных установлено значение по умолчанию (обычно ноль или ноль) и попытка сериализации, Исключение SerializationException.

Обычно это не должно быть проблемой, потому что как только вы попытаетесь сериализовать объект с членом, отмеченным EmitDefaultValue = false, IsRequired = true и значением по умолчанию, вы получите SerializationExeception, поэтому проблема очень очевидно (я только что проверил). Тем не менее, я мог видеть ситуации, когда EmitDefaultValue равен false, а через некоторое время IsRequired установлен на true, что создает проблемы (мы надеемся, что они попали в тестирование до развертывания изменения).

Еще одна возможная проблема с этой комбинацией: клиент может отправлять данные со значением по умолчанию, и это будет десериализовано без проблем. Ваша служба может затем сохранить ее в базе данных, а затем попытаться отправить ее обратно, что приведет к исключению.

С учетом всего вышесказанного, я думаю, что вы используете настройку по конкретным причинам, указанным в документации. Просто знайте о потенциальном конфликте с IsRequired.

...