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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top