Comment sérialiser un objet à envoyer sur le réseau
Je suis en train de sérialiser des objets à envoyer sur le réseau par l'intermédiaire d'un socket en utilisant seulement STL. Je ne suis pas à trouver un moyen de garder la structure des objets pour être désérialisé dans l'autre hôte. J'ai essayé la conversion à string
, à char*
et j'ai passé un long moment à la recherche de tutoriels sur internet et jusqu'à maintenant, je n'ai rien trouvé.
Est-il un moyen de le faire seulement avec la STL?
Y a de bons tutoriels?
Je suis presque en essayant de stimuler, mais si il est comment le faire avec STL j'aimerais apprendre.
juste utiliser boost, boost.org/doc/libs/1_43_0/libs/serialization/doc/index.html
Je recommande de vérifier c++ faq lite sur la sérialisation. Il contient beaucoup d'informations utiles. parashift.com/c++-faq-lite/serialization.html
Google Protocol Buffers valent un coup d'oeil: code.google.com/apis/protocolbuffers/docs/overview.html
Je recommande de vérifier c++ faq lite sur la sérialisation. Il contient beaucoup d'informations utiles. parashift.com/c++-faq-lite/serialization.html
Google Protocol Buffers valent un coup d'oeil: code.google.com/apis/protocolbuffers/docs/overview.html
OriginalL'auteur Lucas Arbiza | 2010-07-16
Vous devez vous connecter pour publier un commentaire.
Vous pouvez sérialiser avec quoi que ce soit. Tous les sérialisation signifie que vous sont en train de convertir l'objet d'octets, de sorte que vous pouvez les envoyer par un flux (comme un
std::ostream
) et de le lire avec un autre (comme unstd::istream
). Juste remplaceroperator <<(std::ostream&, const T&)
etoperator >>(std::istream&, T&)
oùT
est à chacun de vos types. Et tous les types contenus dans votre types.Cependant, vous devriez probablement utiliser une bibliothèque existante (Boost est assez agréable). Il ya des tonnes de choses qu'une bibliothèque comme Boost fait pour vous, comme des octets de commande, en prenant soin des objets communs (comme les tableaux et tous les trucs de la bibliothèque standard), assurant des moyens de réaliser la sérialisation et des tonnes d'autres trucs.
Il y a longtemps? L'un des actuelle objectifs de la bibliothèque est:
Data Portability - Streams of bytes created on one platform should be readable on any other.
Donc je suis assez sûr.Je vous remercie. Il m'aide.
OriginalL'auteur Travis Gockel
Ma première question sera: voulez-vous la sérialisation ou de la messagerie ?
Il peut sembler stupide au premier abord, puisque vous avez demandé pour la sérialisation, mais je suis toujours distinguer les deux termes.
Trop souvent j'ai vu des gens utiliser la Sérialisation où le message doit avoir été utilisé. Cela ne signifie pas que la Sérialisation est inutile, mais ça ne signifie pas que vous devez penser à l'avance de temps. Il est assez difficile de modifier la NOMENCLATURE, une fois que vous avez décidé de le sérialiser, surtout si vous décidez de déménager une partie de l'information (les déplacer d'un objet à un autre)... car alors, comment allez-vous décoder la "vieille" version sérialisée ?
Maintenant que cela est été éclairci...
... Je vais vous recommandons d'utiliser Google Protocole de la mémoire Tampon.
Vous pourriez parfaitement réécrire votre propre en utilisant la STL, mais vous auriez à faire un travail qui a déjà été fait, et à moins que vous souhaitiez apprendre, c'est tout à fait inutile.
Une grande chose au sujet
protobuf
est que c'est un langage agnostique, dans un sens: c'est à dire vous pouvez générer de l'encodeur/décodeur d'un message donné pour C++, Java ou Python. L'utilisation de Python est agréable pour les message d'injection (test) ou un message de décodage (pour vérifier la sortie d'un message journalisé). Ce n'est pas quelque chose qui serait facile d'utiliser la STL.Eh bien, il peut être pensé comme par messagerie encore 🙂 par Messagerie est à propos de l'envoi d'informations, que l'information coïncide avec un objet donné de votre Modèle d'Affaires n'a pas vraiment d'importance.
OriginalL'auteur Matthieu M.
La sérialisation des Objets en C++ sur un Socket Réseau
C'est 6 ans de retard, mais j'ai récemment eu ce problème et c'était l'un des fils que j'ai rencontré dans ma recherche sur la façon de sérialiser un objet par l'intermédiaire d'un réseau de prise en C++. Cette solution utilise seulement 2 ou 3 lignes de code. Il y a beaucoup de réponses que j'ai trouvé du travail, mais le plus simple que j'ai trouvé est d'utiliser
reinterpret_cast<obj*>(target)
pour convertir la classe ou la structure en un tableau de caractères et l'alimentation à travers le support. Voici un exemple.Classe pour être sérialisé:
Programme Serveur:
Programme Client:
Compiler à la fois server.cpp et client.cpp à l'aide de
g++
avec-std=c++11
comme une option. Vous pouvez ensuite ouvrir deux terminaux et exécuter les deux programmes, cependant, démarrez le programme serveur avant que le client de sorte qu'il a quelque chose à se connecter.Espère que cette aide.
OriginalL'auteur Duncan Iglesias
Je l'ai eu!
J'ai utilisé strinstream pour sérialiser des objets et je l'ai envoyé un message à l'aide de la stringstream de la méthode str() et donc de la chaîne de c_str().
Look.
Je ne suis pas sûr s'il est nécessaire de convertir à la chaîne avant de sérialiser (ss << o), c'est peut-être possible directement à partir de char.
Object.b
contient des espaces?Un message d'erreur. C'est parce que c'est nécessaire, d'utiliser getline pour lire dans de la chaîne b. Comme c': getline (in, objet.b) dans friend istream& opérateur>> (istream& Objet& objet) intead dans >> objet.b.
OriginalL'auteur Lucas Arbiza
Je pense que vous devriez utiliser google Protocol Buffers dans votre projet.Dans le réseau de transport Protocol buffers ont de nombreux avantages sur XML pour la sérialisation de données structurées. Protocol buffers:
sont plus simples
sont 3 à 10 fois plus petits
de 20 à 100 fois plus rapide
sont moins ambiguë
générer des classes d'accès aux données qui sont plus faciles à utiliser programmaticall
et ainsi de suite. Je pense que vous devez lire https://developers.google.com/protocol-buffers/docs/overview sur protobuf
OriginalL'auteur MYLOGOS