WCF Tipo primitivo vs tipo complexo
-
21-09-2019 - |
Pergunta
Estou projetando um serviço WCF que retornará uma lista de objetos que estão descrevendo uma pessoa no sistema.
A contagem de recordes é realmente grande e lá tenho algumas propriedades como o sexo da pessoa. É melhor criar uma nova enumeração (é um tipo complexo e consome mais largura de banda) nomeado sexo com dois valores (masculino e feminino) ou usa um tipo primitivo para isso, como Bool Ismale?
Solução
Muito pouco ponto muda para Bool; O que é maior:
<gender>male</gender> (or an attribute gender="male")
ou
<isMale>true</isMale> (or an attribute isMale="true")
Não muito nele;-p
A contagem de recordes é realmente grande ...
Se a largura de banda se tornar um problema, e Você controla as duas extremidades do serviço, então, em vez de mudar suas entidades, você pode olhar para algumas outras opções:
- pré-compra os dados como (por exemplo) gzip e passe (em vez disso)
byte[]
ouStream
, observando para ativar o MTOM no serviço - (ou) trocar o serializador; O Proobuf-Net possui ganchos WCF e pode obter melhorias significativas em largura de banda em relação ao padrão
DataContractSerialier
(Novamente: Ativar MTOM). Em um teste baseado nos dados do Northwind (aqui) Reduziu 736.574 bytes para 133.010. e reduziu a CPU necessária para processá -lo (Win: Win). Para informações, ele reduz as enum ao inteiro, geralmente exigindo apenas 1 byte para o valor da enumeração e 1 byte para identificar o campo; contrasta com<gender>Male</gender>
, que em UTF8 são 21 bytes (mais para a maioria das outras codificações), ougender="male"
aos 14 bytes.
No entanto, qualquer uma das mudanças quebrará seu serviço se você tiver chamadores externos que esperam sabão comum ...
Outras dicas
O motivo para não usar um enum
é que o esquema XML não tem um conceito equivalente a um enum
. Isto é, ele não tem um conceito de valores nomeados. O resultado é que as enumes nem sempre traduzem entre plataformas.
Use um bool ou um campo de caractere único.
Eu sugiro que você o modele da maneira mais natural até encontrar um problema específico ou encontrar um requisito para uma mudança.
O WCF foi projetado para abstrair os detalhes subjacentes e, se a largura de banda é uma preocupação, acho que um bool, int ou enum provavelmente serão 4 bytes. Você pode otimizar usando uma máscara de bits ou um único byte.
Novamente, a facilidade de uso da API e a manutenção é provavelmente mais importante, qual você prefere?
if( user[i].Sex == Sexes.Male )
if( user[i].IsMale == true; ) // Could also expose .IsFemale
if( user[i].Sex == 'M' )
etc. Claro que você pode expor múltiplas.