104 votes

Comment vous sérialisez un objet en C++ ?

J'ai une petite hiérarchie des objets que j'ai besoin de sérialiser et transmettre via une connexion de socket. J'ai besoin à la fois de sérialiser l'objet, puis désérialiser sur la base de quel type il est. Est-il un moyen facile de faire cela en C++ (comme il est en Java)?

Y a-C++ sérialisation en ligne des exemples de code ou des tutoriels?

EDIT: Juste pour être clair, je suis à la recherche de méthodes sur la conversion d'un objet dans un tableau d'octets, puis de nouveau dans un objet. Je peux gérer le support de transmission.

62voto

newgre Points 2821

Parler de la sérialisation, le boost de la sérialisation de l'API vient à mon esprit. Comme pour la transmission de données sérialisées sur le net, je préfère utiliser les sockets Berkeley ou de l' asio de la bibliothèque.

Edit:
Si vous souhaitez sérialiser vos objets à un tableau d'octets, vous pouvez utiliser le boost sérialiseur de la manière suivante (extrait du tutoriel du site):

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
class gps_position
{
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & degrees;
        ar & minutes;
        ar & seconds;
    }
    int degrees;
    int minutes;
    float seconds;

public:
    gps_position(){};
    gps_position(int d, int m, float s) :
    degrees(d), minutes(m), seconds(s)
    {}
};

Réelle, la sérialisation est alors assez facile:

#include <fstream>
std::ofstream ofs("filename.dat", std::ios::binary);

    // create class instance
    const gps_position g(35, 59, 24.567f);

    // save data to archive
    {
        boost::archive::binary_oarchive oa(ofs);
        // write class instance to archive
        oa << g;
        // archive and stream closed when destructors are called
    }

La désérialisation fonctionne de manière analogique.

Il y a aussi des mécanismes qui permettent de gérer la sérialisation des pointeurs (structures de données complexes comme des arbres, etc ne sont pas un problème), les classes dérivées et vous pouvez choisir entre le binaire et le texte de la sérialisation. En plus de tous les conteneurs STL sont pris en charge hors de la boîte.

15voto

Mr.Ree Points 5112

Dans certains cas, lorsque vous traitez avec les types simples, vous pouvez faire:

object o;
socket.write(&o, sizeof(o));

C'est ok comme une preuve de concept ou du premier projet, afin que les autres membres de votre équipe peut continuer à travailler sur d'autres parties.

Mais tôt ou tard, habituellement plus tôt, cela pourrait vous blesser!

Vous rencontrez des problèmes avec:

  • Virtuel pointeur de tables seront corrompus.
  • Les pointeurs (pour les données/membres/fonctions) sera endommagé.
  • Les différences dans le rembourrage/alignement sur des machines différentes.
  • Big/Little-Endian ordre des octets questions.
  • Les Variations dans la mise en œuvre de float/double.

(De Plus, vous devez savoir ce que vous déballage sur le côté de réception.)

Vous pouvez améliorer sur ce point par le développement de votre propre marshalling/unmarshalling méthodes pour chaque classe. (Idéalement virtuel, de sorte qu'ils peuvent être étendus dans les sous-classes.) Quelques macros simples vous permettra d'écrire les différents types de base assez rapidement dans un big/little-endian-ordre neutre.

Mais cette sorte de grognement travail est beaucoup mieux et plus facilement, gérés par l'intermédiaire de stimuler la sérialisation de la bibliothèque.

2voto

17 of 26 Points 15941

Je ne sais pas si vous cherchez juste pour la sérialisation ou si vous cherchez une bibliothèque de communication réseau, mais l' Environnement de Communication adaptative est une excellente bibliothèque OO de multi-plateforme pour faire la communication socket.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X