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?

È stato utile?

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[] o Stream, 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), o gender="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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top