Вопрос

Я разрабатываю службу 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' )

и т. д.Конечно, вы можете выставить несколько.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top