2010-08-05 12 views
3

J'ai une question générale de programmation de socket pour vous.Question de socket générale - Transfert de structures C++ de Java vers C++

J'ai un struct C appelé Data:

struct data { 
     double speed; 
     double length; 
     char carName[32]; 
     struct Attribs; 
} 

struct Attribs { 
     int color; 
} 

Je voudrais être en mesure de créer une structure similaire en Java, créer une socket, créez le paquet de données avec le struct ci-dessus, et l'envoyer à un écouteur de socket C++.

Que pouvez-vous me dire à propos des données sérialisées (en gros, les 1 et les 0 qui sont transférés dans le paquet). Comment C++ "lit" ces paquets et recréer la structure? Comment sont stockées ces structures dans le paquet?

Généralement, tout ce que vous pouvez me dire pour me donner des idées sur la façon de résoudre un tel problème.

Merci!

Répondre

3
  • Soyez fatigué de l'endianness si vous utilisez la sérialisation binaire. La JVM de Sun est Big Endian, et si vous êtes sur un Intel x86 vous êtes sur une petite machine d'Endian.
  • J'utiliserais le ByteBuffer de Java pour la sérialisation natif rapide. Les ByteBuffers font partie de la bibliothèque NIO, donc supposés être plus performants que les anciens DataInput/OutputStreams.
  • Soyez particulièrement fatigué des flotteurs de sérialisation! Comme suggéré ci-dessus, il est plus sûr de transférer toutes vos données à des chaînes de caractères à travers le fil.
  • Sur le côté C++, quel que soit le réseau, vous aurez un tampon rempli de données à un certain point. Ainsi votre code désérialisation ressemblera à quelque chose comme:

size_t amount_read = 0; 
data my_data; 
memcpy(buffer+amount_read, &my_data.speed, sizeof(my_data.speed)) 
amount_read += sizeof(my_data.speed) 
memcpy(buffer+amount_read, &my_data.length, sizeof(my_data.length)) 
amount_read += sizeof(my_data.length) 
  • Notez que la taille des types C++ de base est défini par l'implémentation, vous les types primitifs en Java et C++ ne se traduisent pas directement.
  • Vous pouvez utiliser les tampons Google Protocol. Ma solution préférée si j'ai affaire à une variété de structures de données.
  • Vous pouvez également utiliser JSON pour la sérialisation.
+0

Merci! Je vais regarder ça! –

0

Le processus de base est le suivant:

  • application java crée une version portable des struct dans l'application Java, par exemple XML
  • application java envoie XML à l'application C++ via une prise
  • app C++ XML reçoit de l'application java
  • application C++ crée des instances de struct, en utilisant les données dans le message XML
+0

On m'a dit d'utiliser un fichier XML Schema (XSD). Ensuite, utilisez ant pour créer une classe Java Bean. La classe java bean est sérialisable ... donc j'envoie les données de la classe java bean. Est-ce la bonne méthode? En allant dans les détails, comment peut-on avoir un analogue XML pour les tableaux char, ou les énumérations? Btw, où puis-je en lire plus? –

+0

@Carlo Vous ne pouvez pas avoir d'analogues directs pour tous les types Java et C++ - votre code devra effectuer des conversions appropriées. Alors créez votre bean, faites-le sérialiser, puis regardez le XML qu'il produit. Alternativement, trouvez une bibliothèque qui fera tout cela pour vous ou utiliserez (shudder) quelque chose comme CORBA, SOAP etc. –

+0

Merci monsieur! Je vais garder cela à l'esprit! –