WCF tipo primitivo vs tipo complesso
-
21-09-2019 - |
Domanda
Sto progettando un servizio WCF che restituirà un elenco di oggetti che descrivono una persona nel sistema.
Il numero di record è davvero grande e ci ho alcuni immobili come il sesso della persona. E 'meglio per creare un nuovo enum (Si tratta di un complesso di tipo e consuma più banda) di nome Sex con due valori (maschio e femmina) o utilizzare un tipo primitivo per questo come bool IsMale?
Soluzione
Molto poco commutazione scegliere bool; che è più grande:
<gender>male</gender> (or an attribute gender="male")
o
<isMale>true</isMale> (or an attribute isMale="true")
Non c'è molto in esso ;-P
Il numero di record è davvero grande ...
Se la larghezza di banda diventa un problema, e di controllare entrambe le estremità del servizio , quindi piuttosto che modificare le entità si poteva guardare alcune altre opzioni:
- pre-comprimere i dati (per esempio) gzip, e passa (invece) un
byte[]
oStream
, notando per consentire MTOM sul servizio - (o) Interruttore serializer; proobuf-rete ha ganci WCF, e può raggiungere (nuovo: abilitare MTOM) miglioramenti significativi sulla banda
DataContractSerialier
predefinito. In un test basato su Northwind (qui) ha ridotto 736,574 byte a 133.010. e ha ridotto la CPU necessario per elaborarlo (win: win). Per informazioni, riduce enums a numeri interi, tipicamente richiedono solo 1 byte per il valore enum e 1 byte per identificare il campo; contrasto a<gender>Male</gender>
, che sotto UTF8 è di 21 byte (per la maggior parte più altre codifiche), ogender="male"
a 14 byte.
Tuttavia, sia il cambiamento si romperà il vostro servizio se si dispone di chiamanti esterni che si aspettano sapone normale ...
Altri suggerimenti
La ragione per non utilizzare un enum
è che XML Schema non ha un concetto equivalente ad un enum
. Cioè, non ha un concetto di valori denominati. Il risultato è che le enumerazioni non sempre si traducono tra le piattaforme.
Usa un bool, o in un campo singolo carattere, invece.
Io suggerirei di modellarla in qualsiasi modo sembra più naturale fino a quando si esegue in un problema specifico o in caso di un requisito per un cambiamento.
WCF è stato progettato per astratti i dettagli sottostanti, e se la larghezza di banda è una preoccupazione, allora penso che un bool, int o enum saranno tutti probabilmente 4 byte. Si potrebbe ottimizzare utilizzando una maschera di bit o utilizzando un singolo byte.
Anche in questo caso, la facilità d'uso delle API e manutenibilità è probabilmente più importante, quale preferisci?
if( user[i].Sex == Sexes.Male )
if( user[i].IsMale == true; ) // Could also expose .IsFemale
if( user[i].Sex == 'M' )
ecc. Naturalmente si potrebbe esporre multipla.