J'écris une application .NET qui apportera un appel RPC à une application Java (via une file d'attente de message). Les données envoyées dans les deux directions seront de grandes tableaux de nombres à virgule flottante. Quelle est la meilleure façon de les sérialiser pour les envoyer sur le fil? J'aimerais quelque chose de plus compact que le texte, mais indépendant de l'architecture, car le serveur peut ne pas être une machine X86. L'application Java peut être modifiée si nécessaire. P>
4 Réponses :
JSON me vient à l'esprit. Ou c'est une contrepartie binaire, BSON . Les deux ont des implémentations en Java et .NET P>
BSON avait l'air prometteur, mais il ne semble pas y avoir beaucoup de soutien du client. Le lien "Client Java" passe simplement à un fichier source unique dans certains pilotes de DB. Wtf?
Le texte est vraiment le seul moyen indépendant de la plate-forme de représenter des numéros de points flottants, et c'est certainement le plus facile à faire. Si vous êtes préoccupé par la taille du message, vous pouvez toujours gzip vos messages. P>
Je lise actuellement sur
Les primitives numériques Java sont stockées (dans la JVM) et écrites (via Donc, vous pouvez envoyer et recevoir une primitive à l'aide des deux classes mentionnées ici (et les contreparties d'entrée) tant que le côté .NET est la lecture / écriture dans l'ordre d'octet de réseau comme vous devez toujours utiliser. p> côté Java par exemple: p> C # pour récupérer la valeur: p> Pour écrire, vous faites le contraire, c # doit écrire dans l'ordre d'octet de réseau. p> puis sur le côté Java pour les lire dans: p> le C # jnava.io.dataOutputStream code> et
java.nio.bytebuffer code>) dans la commande réseau et la flottante Les valeurs de points sont la norme IEEE. Ils sont directement interchangeables avec C # /. Net. Eh bien, si .NET fournissait l'ordre d'octet de réseau pour lire des doubles (voir ci-dessous pour le code).
ipaddress code> classe fournit des méthodes de lecture / écriture de byte de réseau pour toutes les primitives sauf double et flottant, mais comme Dans mon exemple, vous pouvez passer à travers un document 32 bits ou 64 bits respectivement. p> p>
Vous savez, je pourrais aller avec cette approche simple. .NET a aussi system.io.binarinwriter code> et
system.io.binarinyreader code> qui gère la sérialisation. (Je n'utiliserai pas directement des cours de socket.)
C # est .NET; Le BinaryReader code> et
binarywriter code> dans mes exemples sont .NET; Ceux-ci n'existent pas en Java.
Si vous souhaitez mettre les valeurs dans les tableaux d'octets et utiliser les personnes séparément, vous pouvez utiliser Java's Java.NIO.BYTEBuffer code>. Voir ma réponse ici: Stackoverflow.com/Questtions/28688885/...
Rabbitmq, mais je ne veux probablement pas en dépendre de cela, non plus. Je vais juste l'envoyer un tableau d'octets et je m'occupe de la sérialisation moi-même.