2009-10-15 3 views
1

Я проектирую службу WCF, которая вернет список объектов, которые описывают человека в системе.Тип примитива WCF и сложный тип

Показатель записи действительно большой, и у меня есть некоторые свойства, такие как секс человека. Лучше ли создать новое перечисление (это сложный тип и потребляет большую полосу пропускания) с именем «Пол» с двумя значениями (мужское и женское) или использовать примитивный тип для этого, например, bool IsMale?

ответ

2

Очень маленькая точка переключения на 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 (here), он уменьшил 736 574 байт до 133,010. и уменьшили процессор, необходимый для его обработки (выигрыш: выигрыш). Для информации он уменьшает количество перечислений до целых чисел, обычно для определения поля требуется только 1 байт для значения перечисления и 1 байт; контраст с <gender>Male</gender>, который под UTF8 равен 21 байту (больше для большинства других кодировок) или gender="male" при 14 байтах.

Однако изменение приведет к нарушению обслуживания, если у вас есть внешние абоненты, ожидающие регулярного SOAP ...

1

Причина, по которой не использовать enum, заключается в том, что в XML-схеме нет концепции, эквивалентной enum. То есть, у него нет понятия именованных значений. В результате перечисления не всегда переводятся между платформами.

Вместо этого используйте поле bool или односимвольное поле.

1

Я предлагаю вам смоделировать его каким бы то ни было образом кажется естественным до тех пор, пока вы не столкнетесь с определенной проблемой или не столкнетесь с необходимостью изменения.

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') 

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

 Смежные вопросы

  • Нет связанных вопросов^_^