Примитивный тип WCF против сложного типа
-
21-09-2019 - |
Вопрос
Я разрабатываю службу WCF, которая будет возвращать список объектов, описывающих человека в системе.
Количество записей действительно велико, и у меня есть некоторые свойства, такие как пол человека.Лучше ли создать новое перечисление (это сложный тип и потребляет больше пропускной способности) с именем Sex и двумя значениями (мужской и женский) или использовать для этого примитивный тип, например bool IsMale?
Решение
Очень мало смысла переключаться на bool;что больше:
<gender>male</gender> (or an attribute gender="male")
или
<isMale>true</isMale> (or an attribute isMale="true")
Ничего особенного в этом нет ;-p
Количество записей действительно велико...
Если пропускная способность становится проблемой и вы контролируете обе стороны услуги, то вместо того, чтобы менять свои сущности, вы можете рассмотреть некоторые другие варианты:
- предварительно сжать данные как (например) gzip и передать (вместо этого)
byte[]
илиStream
, отмечая необходимость включения MTOM в службе - (или) переключить сериализатор;proobuf-net имеет перехватчики WCF и может добиться значительного улучшения пропускной способности по сравнению со стандартным
DataContractSerialier
(снова:включить MTOM).В тесте на основе данных Northwind (здесь) он уменьшил 736 574 байта до 133 010. и уменьшил загрузку ЦП, необходимую для его обработки (win:win).Для информации он сводит перечисления к целым числам, обычно требуя только 1 байт для значения перечисления и 1 байт для идентификации поля;контрастировать с<gender>Male</gender>
, который в UTF8 составляет 21 байт (для большинства других кодировок больше), илиgender="male"
в 14 байт.
Однако любое изменение нарушит работу вашего сервиса, если у вас есть внешние абоненты, ожидающие обычного SOAP...
Другие советы
Причина не использовать enum
заключается в том, что XML-схема не имеет концепции, эквивалентной enum
.То есть в нем нет понятия именованных значений.В результате перечисления не всегда переводятся между платформами.
Вместо этого используйте логическое значение или односимвольное поле.
Я бы посоветовал вам смоделировать это любым наиболее естественным способом, пока вы не столкнетесь с конкретной проблемой или не столкнетесь с необходимостью внесения изменений.
WCF предназначен для абстрагирования основных деталей, и если пропускная способность вызывает беспокойство, я думаю, что bool, int или enum, вероятно, будут иметь размер 4 байта.Вы можете оптимизировать, используя битовую маску или один байт.
Опять же, простота использования API и удобство обслуживания, вероятно, важнее, что вы предпочитаете?
if( user[i].Sex == Sexes.Male )
if( user[i].IsMale == true; ) // Could also expose .IsFemale
if( user[i].Sex == 'M' )
и т. д.Конечно, вы можете выставить несколько.