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

Boost C++ Discussion :

[Serialization]Pointeurs sur strings et serialize


Sujet :

Boost C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut [Serialization]Pointeurs sur strings et serialize
    Bonjour.

    Je suis actuellement confronté à un problème avec serialize lorsqu'on l'utilise sur des pointeurs de string. en effet, l'exemple:
    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
    #include <boost/archive/text_oarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
    #include <boost/serialization/string.hpp>
    #include <fstream>
    #include <string>
    int main()
    {
      std::string* s=new std::string("lalala");
      std::ofstream of("file.txt");
      {
        boost::archive::text_oarchive oa(of);
        // write class instance to archive
        oa << s;
        // archive and stream closed when destructors are called
      }
      delete s;
      return 0;
    }
    ne compile pas et me donne l'erreur (erreur principale en rouge à la fin):
    Citation Envoyé par gcc 4.4.1
    -------------- Build: Debug in Boost_Serialize_Test ---------------

    Compiling: main.cpp
    In file included from /usr/include/boost/serialization/split_member.hpp:23,
    from /usr/include/boost/serialization/nvp.hpp:33,
    from /usr/include/boost/serialization/serialization.hpp:17,
    from /usr/include/boost/archive/detail/oserializer.hpp:61,
    from /usr/include/boost/archive/detail/interface_oarchive.hpp:24,
    from /usr/include/boost/archive/detail/common_oarchive.hpp:20,
    from /usr/include/boost/archive/basic_text_oarchive.hpp:32,
    from /usr/include/boost/archive/text_oarchive.hpp:31,
    from /.../main.cpp:2:
    /usr/include/boost/serialization/access.hpp: In static member function ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]’:
    /usr/include/boost/serialization/serialization.hpp:74: instantiated from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]’
    /usr/include/boost/serialization/serialization.hpp:133: instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]’
    /usr/include/boost/archive/detail/oserializer.hpp:140: instantiated from ‘void boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::archive::text_oarchive, T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]’
    /.../main.cpp:87: instantiated from here
    /usr/include/boost/serialization/access.hpp:109: error: ‘struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >’ has no member named ‘serialize’
    Process terminated with status 1 (0 minutes, 4 seconds)
    1 errors, 0 warnings
    ... pourtant ce ne devrait pas être le cas d'après la doc ... à moins que les classes de bases de std::string doivent être enregistrées mais je suis étonné qu'elles ne le soient pas déjà dans boost/serialization/string.hpp...

    J'utilise gcc 4.4.1 et boost 4.0...

    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    J'ai finalement pu trouver (à l'aide de la boost mailing list ) d'ou venait le preblème.

    En effet, il semble que serialization ne supporte pas les pointeurs sur types primitifs... et apparement std::string en est un... :
    Citation Envoyé par doc boost.serialization
    By default, data types designated primitive by Implementation Level class serialization trait are never tracked. If it is desired to track a shared primitive object through a pointer (e.g. a long used as a reference count), It should be wrapped in a class/struct so that it is an identifiable type. The alternative of changing the implementation level of a long would affect all longs serialized in the whole program - probably not what one would intend.

    j'ai donc créé un petit wrapper et cela à fonctionné nickel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    {
      Wrapper<std::string> * x=new Wrapper<std::string>("blabla");
     
      std::ofstream of("file.txt");
      {
        boost::archive::text_oarchive oa(of);
        // write class instance to archive
        oa << x;
        // archive and stream closed when destructors are called
      }
      of.close();
      return 0;
    }
    bon, eh ben résolu.

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    ty

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/03/2010, 16h31
  2. Pointeur sur une chaine de caractère string
    Par Lucier dans le forum C#
    Réponses: 9
    Dernier message: 17/03/2010, 14h22
  3. Boost Serialization pointeur
    Par pavel dans le forum Boost
    Réponses: 8
    Dernier message: 09/02/2010, 18h25
  4. [Serial] Commencer sur une valeur précise
    Par e1lauren dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 31/07/2006, 14h34
  5. Set serial Number sur une disquette
    Par Cpet dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/12/2004, 10h24

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