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

C++ Discussion :

Sérialisation en binaire (sans Boost)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Par défaut Sérialisation en binaire (sans Boost)
    bonjour,

    Je travail sur un projet où j'ai besoin de sérialiser en binaire un objet (Contig).
    Cet objet contient :

    string name, string basecalls, string quality et un vector <pair <string,string> >.

    L'idée de mon main est de parser un fichier, puis je prend les infos de ce fichier j'en crée mes objets Contig, toujours dans le main, j'ai un vecteur de Contig que je souhaite donc sérialiser. Pour ceci j'ai mon operator<< que voici :
    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
     
    //Contig.cpp
    ostream& operator<< (ostream& stream, Contig const &obj) {
      size_t nameSize (obj.name.length()), basecallsSize(obj.basecalls.length()), qualitySize(obj.quality.length()), vectorSize (obj.v_DirPos.size()), srcSize, clrSize;
     
      //name, basecalls and quality
      stream.write ((char*)&nameSize, sizeof(int));
      stream.write (obj.name.c_str(), nameSize);
     
      stream.write ((char*)&basecallsSize, sizeof(int));
      stream.write (obj.basecalls.c_str(), basecallsSize);
     
      stream.write ((char*)&qualitySize, sizeof(int));
      stream.write (obj.quality.c_str(), qualitySize);
     
      //vector
      stream.write ((char*)&vectorSize, sizeof(vectorSize));
      for (int i=0; i<(signed)obj.v_DirPos.size(); i++) {
        srcSize=obj.v_DirPos[i].first.length();
        stream.write ((char*)&srcSize, sizeof(srcSize));
        stream.write (obj.v_DirPos[i].first.c_str(), srcSize);
     
        clrSize=obj.v_DirPos[i].second.length();
        stream.write ((char*)&clrSize, sizeof(clrSize));
        stream.write (obj.v_DirPos[i].second.c_str(), clrSize);
      }
      return stream;
    }
    Dans mon main, je fais appel a celui ci, comme ça :
    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
     
    //main.cpp
    int main(void) {
      try {
        vector<Contig> contigVector;
        Contig c1;
        Parser p;
        filebuf fb;
        char * file = "res/velvet_asm.afg";
     
        fb.open (file, ios::in);
        istream is (&fb);
     
        p.parseFile (is);
        contigVector = p.vectorToContig (p.getVector());
     
        ofstream ofs("res/output",ofstream::binary);
        ostream_iterator<Contig> osi (ofs);
        copy(contigVector.begin(), contigVector.end(), osi);
        //etc...
    Voila, donc il doit sans doute y avoir des manière plus propre de coder ce que j'ai fait...

    Sinon mon problème est que mon fichier de sortie n'est pas en binaire, il est bel et bien écrit en ascii et lisible par un humain^^. C'est donc la mon problème et je ne vois pas vraiment ce qui ne va pas dans mon code...
    si besoin de plus de précision, pas de souci.

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Fichier binaire, ça ne veut pas dire grand chose...

    Si tu stockes dans ton fichier "binaire" du texte encodé comme du texte, il est lisible

  3. #3
    Futur Membre du Club
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Par défaut
    erf ok désolé je vois l'idée :/
    Mais justement ce que je souhaiterais faire c'est ne pas stocker mes infos encodées comme du texte dans un fichier.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Quel est le but
    - compression ?
    - cryptage ?
    ...

  5. #5
    Futur Membre du Club
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Par défaut
    C'est dans un but de compression. Les fichiers que je lis ne sont pas forcement leger (a partir de 5Mo jusqu'a...une centaine voir plus), de la je tire juste les info que je veux, je voudrais ensuite sérialiser les objets crées a partir de ces infos puis plus tard je "désérialiserais" lorsque j'aurais a nouveau besoin de ces infos.
    D'apres ce que j'ai lu sur le net, une sérialisation en "non-human-readable ("binary") format" serait plus rapide aussi. c'est pourquoi je voulais me pencher la dessus.

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    y'a t il une contrainte particulière qui t'empêche d'utiliser boost::serialization?

Discussions similaires

  1. Sérialisation binaire sans "Serializable"
    Par ®om dans le forum Persistance des données
    Réponses: 1
    Dernier message: 03/08/2007, 12h10
  2. Threads en C++ (sans boost ?)
    Par rbcmax dans le forum C++
    Réponses: 18
    Dernier message: 24/12/2006, 17h48
  3. Decimal -> Binaire (sans utiliser de tableau)
    Par Sandro Munda dans le forum C
    Réponses: 3
    Dernier message: 14/10/2006, 18h09
  4. Sérialisation d'objets sans Boost
    Par Alp dans le forum Boost
    Réponses: 7
    Dernier message: 24/09/2006, 11h43
  5. [Binaire] Conversion decimal -> binaire sans vecteur
    Par yann1979 dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2005, 16h10

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