IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

serialiser un objet sans utiliser de bibliothèque externe


Sujet :

Langage C++

  1. #1
    Membre éprouvé Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Points : 969
    Points
    969
    Par défaut serialiser un objet sans utiliser de bibliothèque externe
    Bonjour,
    Je suis restreins à ne pas utiliser de bibliothèque et il me faudrait créer ma propre classe de sérialisation.
    Seulement la je bloque un peu. le mieux serait que je fasse de la sérialisation binaire alors prenons l'exemple d'une classe tout bête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class objectToutbete {
         string id, contenu;
    }
    comment pourrais faire pour sérialiser et desérialiser ça simplement?

    merci d'avance,

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Bonjour !!

    Tu dis que tu ne dois pas utiliser "de bibliothèque", mais vu que tu utilises une classe standard (string) dans ton petit exemple, j'assume que tu as au moins droit à la bibliothèque standard du C++.

    Il se trouve qu'elle vient accompagnée d'un tas de composants pour gérer les entrées/sorties et, ce qui est encore plus intéressant, elle vient accompagnée d'une armée de conventions. Programmer en C++, surtout de nos jours, nécessite de connaitre ses conventions, et savoir comment les appliquer. L'une d'entre elles, c'est qu'un développeur puisse s'attendre à produire le contenu d'un objet sur la console en faisant un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout << objet_a_ecrire << "\n";
    Pour que cela marche, il faut qu'il existe un opérateur capable d'écrire "objet_a_ecrire" vers la sortie spécifiée en argument, habituellement un objet du type std::ostream.

    L'inverse marche aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cin >> objet_a_lire;
    devrait placer "objet_a_lire" dans un état stable définit par ce qui a été lu sur l'entrée standard.

    En utilisant cette convention et en implémentant les deux opérateurs appropriés, on peut faire ce que tu demande de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    /*
        test.cpp
    */
     
    #include <iostream>
    #include <fstream>
    #include <string>
     
    // Ton exemple, modifié pour compiler
    class objectToutbete
    {
    public:
         std::string    id;
         std::string    contenu;
    };
     
    // L'opérateur de sortie
    std::ostream&    operator<< (std::ostream& out, const objectToutbete& otb)
    {
        out << otb.id;
        out << " ";
        out << otb.contenu;
        return out;
    }
     
    // L'opérateur d'entrée
    std::istream&    operator>> (std::istream& in, objectToutbete& otb)
    {
        in >> otb.id;
        in >> otb.contenu;
        return in;
    }
     
    int main (int argc, char **argv)
    {
            // un objet à écrire
        objectToutbete    aecrire;
        aecrire.id = "Identifiant";
        aecrire.contenu = "Phi";
     
            // écriture de l'objet vers un fichier
        std::ofstream out ("test.txt");
        out << aecrire << "\n";
        out.close ();
     
            // lecture de l'objet depuis le fichier
        objectToutbete alire;
        std::ifstream    in ("test.txt");
        in >> alire;
     
            // affichage de l'objet lu
        std::cout << "Objet lu : ";
        std::cout << alire;
     
        return 0;
    }
    Tu noteras que l'écriture vers un fichier et vers la sortie standard ne change rien : c'est la beauté de la chose.

    P.-S. J'ai très peu l'habitude de répondre à des questions sur les streams donc j'espère que je me suis pas trop planté. Je me doute que les experts du forum se feront un plaisir de me corriger.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Les flux, c'est fondamentalement fait pour les fichiers texte.

    Il faut plutôt aller voir de ce côté.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2013, 17h39
  2. Réponses: 2
    Dernier message: 30/08/2011, 23h40
  3. Copier un objet sans utiliser Clone()
    Par celes dans le forum C#
    Réponses: 3
    Dernier message: 26/03/2009, 11h31
  4. Exposition d'un objet en utilisant des données externes
    Par ocroquette dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/11/2005, 21h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo