Sérialiser le message WCF d'une manière binaire et non comme un message SOAP
J'ai une application client-serveur, qui communique à l'aide de la WCF, et utilise NetDataContractSerializer de sérialiser les objets graphique.
Depuis un grand nombre de données transmises entre le serveur et le client, j'ai essayé de diminuer sa taille en adaptant la taille des données des membres (par exemple, changé de int à court, long int, etc.).
Après avoir terminé le réglage, j'ai découvert que la quantité de données transférées n'a pas changé!
Le problème, c'est que le NetDataContractSerializer sérialise les objets graphique XML, alors peu importe quelle est la taille de la donnée-membre, la seule chose qui compte est la taille de sa valeur. Par exemple, la valeur 10023 d'un Int16 membre de données sera sérialisé que la chaîne de caractères "10023" (0x3130303233), au lieu de simplement 10023 (0x2727).
Je me souviens que dans Remoting je pouvais utiliser le BinaryFormatter qui sérialisé les valeurs en fonction du type de la donnée membre, mais je ne sais pas si c'est possible de l'utiliser avec WCF.
Quelqu'un a une solution?
source d'informationauteur Andy
Vous devez vous connecter pour publier un commentaire.
WCF utilise des messages SOAP, mais ce genre de message d'encodage utilisé, est totalement à vous.
Fondamentalement, hors de la boîte, vous avez deux: l'encodage de texte (texte de la représentation de message XML) ou en codage binaire. Vous pouvez écrire votre propre message à l'encodage, si vous devez vraiment et ont besoin.
Hors de la boîte, la basicHttp et wsHttp liaisons utilisent l'encodage du texte - mais vous pouvez le changer si vous le souhaitez. Le netTcp de liaison (qui est le choix préféré derrière le pare-feu d'entreprise) va utiliser les binaires par défaut.
Vous pouvez également définir (config) votre propre "binaire http" protocole, si vous le souhaitez:
et ensuite l'utiliser dans votre service client et côté config:
Maintenant, vous avez un http protocole de transport, ce qui permettra d'encoder vos message en binaire compact, pour vous d'utiliser et de profiter!
Pas de code supplémentaire ou salissant des hacks ou des lots de manuel de la sérialisation XML code nécessaire - il suffit de le brancher et de l'utiliser! Ah, la joie de la WCF souplesse!
Première pensée; avez-vous activé le transport de compression?
La complexité des données? Si c'est quelque chose qui pourrait fonctionner avec la régulière
DataContractSerializer
(c'est à dire un objet simple arbre), puis protobuf-net peut-être utile. C'est un moyen très efficace de sérialisation binaire de la bibliothèque, avec le soutien de la WCF via des attributs supplémentaires sur le contrat de service - par exemple:(le
[ProtoBehaviour]
est ce que les swaps sur les différents sérialiseur pour cette méthode)Cependant:
Order
sur un[DataMember(Order = x)]
attributBien, il travaille également avec MTOM, la réduction de la base 64 coût pour les messages les plus grands.
Le codeur binaire ne sera PAS sérialiser vos objet en binaire, car il n'a rien à voir avec la sérialisation à tous! C'est quelque chose de travailler à une couche inférieure et décide de la façon dont le message est transporté entre le serveur et le client.
En d'autres termes, l'objet sera d'abord être sérialisé (par DataContractSerializer, par exemple) et ensuite codées (par BinaryEncoder). Si votre objet sera toujours au format XML en tant que DataContractSerializer est impliqué.
Si vous voulez un plus compact de données et de meilleures performances, de lire ce blog:
https://blogs.msdn.microsoft.com/dmetzgar/2011/03/29/protocol-buffers-and-wcf/
Voici un exemple de la façon de faire de codage personnalisé ici https://www.codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study
Il est intéressant de noter que ce qui est envoyé est le même que si vous aviez une méthode de service de l'envoi de byte[] avec codage par défaut. Le message sur le fil utilise toujours un SOAP XML enveloppe indépendamment de la façon dont vous configurez la sérialisation.
Il ressemble à ceci: