Question

Je suis la conception d'un service WCF qui renvoie une liste d'objets qui décrivent une personne dans le système.

Le nombre d'enregistrements est vraiment grand et là, j'avoir des propriétés telles que le sexe de la personne. Est-il préférable de créer une nouvelle ENUM (Il est un type complexe et consomme plus de bande passante) nommé Sex avec deux valeurs (mâle et femelle) ou utiliser un type primitif pour cela comme bool IsMale?

Était-ce utile?

La solution

Très peu de points à commutation bool; qui est plus grand:

<gender>male</gender> (or an attribute gender="male")

ou

<isMale>true</isMale> (or an attribute isMale="true")

Pas grand-chose dans ce ;-P

  

Le nombre d'enregistrements est vraiment grand ...

Si la bande passante devient un problème, et vous contrôlez les deux extrémités du service , puis plutôt que de changer vos entités que vous pouvez regarder d'autres options:

  • pré-compresser les données comme (par exemple) gzip, et transmettre (au lieu) une byte[] ou Stream, en notant pour permettre MMD sur le service
  • (ou) sérialiseur de commutation; proobuf-filet a des crochets WCF, et peut obtenir des améliorations de bande passante importante sur la DataContractSerialier par défaut (nouveau: activer MMD). Dans un test basé sur des données Northwind (ici) il a réduit 736,574 octets à 133010. et a réduit la CPU nécessaire pour les traiter (gagnant: gagnant). Pour info, il réduit énumérations à des entiers, ce qui nécessite généralement que 1 octet pour la valeur ENUM et 1 octet pour identifier le champ; Contrairement à <gender>Male</gender> qui, sous UTF8 est de 21 octets (plus pour la plupart des autres codages), ou gender="male" à 14 octets.

Cependant, que ce soit le changement brisera votre service si vous avez les appels externes qui attendent SOAP régulièrement ...

Autres conseils

La raison de ne pas utiliser un enum est que XML Schema ne dispose pas d'un concept équivalent à un enum. À savoir, il ne dispose pas d'un concept de valeurs nommées. Le résultat est que les énumérations ne se traduisent pas toujours entre les plates-formes.

Utilisez un bool, ou un champ d'un seul caractère à la place.

Je vous suggère de modéliser de quelque manière que semble le plus naturel jusqu'à ce que vous rencontrez un problème spécifique ou rencontrez une exigence pour un changement.

WCF est conçu pour résumé les détails sous-jacents, et si la bande passante est une préoccupation alors je pense qu'un bool, int ou ENUM seront tous probablement 4 octets. Vous pouvez optimiser à l'aide d'un masque ou en utilisant un seul octet.

Encore une fois, la facilité d'utilisation de l'API et de maintenabilité est probablement plus important, qui préférez-vous?

if( user[i].Sex == Sexes.Male )

if( user[i].IsMale == true; ) // Could also expose .IsFemale

if( user[i].Sex == 'M' )

etc. Bien sûr, vous pouvez exposer plusieurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top