2010-12-14 65 views
1

Quelle bibliothèque dois-je utiliser pour une sérialisation d'objet qui est l'entrée pour un service web .net (ce qui signifie que ce service web a besoin d'un xml à son entrée)?Linux -> C++ code: Object Serialization

Comme une autre question:

Si vous utilisez la version non intrusive (Boot de sérialisation), lors de l'écriture dans le fichier xml quel est le code exactement? (oa<<?). J'ai essayé quelques solutions mais il semble que j'ai une erreur. Je ne peux pas vraiment dire oa<< g..

Voici le code:

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <dlfcn.h> 
#include <iostream> 
#include <fstream> 

class gps_position 
{ 
public: 
    int degrees; 
    int minutes; 
    float seconds; 
    gps_position(){}; 
}; 

namespace boost { namespace serialization { 

    template<class Archive> 
    void serialize(Archive & ar, gps_position & g, const unsigned int version) 
    { 
     ar & g.degrees; 
     ar & g.minutes; 
     ar & g.seconds; 
    }  

} } // namespace boost::serialization 

// gps_position g; 

int main() { 

    gps_position obj; 
    std::ofstream ofs("filename2.xml"); 

    if(ofs.good()) { 
     //const gps_position g; 

     try { 
      boost::archive::xml_oarchive oa(ofs); 

      // what to write in the xml? 
      oa << ??????????????????; 

     } catch(boost::archive::archive_exception& ex) { 

     } 
    } 
    return 0; 
} 
+1

utiliser @mely balises appropriées pour vos questions: le mieux votre les questions sont marquées, plus vous avez de chances de les voir. –

+1

Etes-vous sûr de vouloir uniquement la sérialisation - et non une boîte à outils SOAP C++ complète? – sdg

+0

@mely: il ne suffit pas de générer "un xml". Il doit être conforme au format attendu par le service web (très probablement une sorte de SOAP) – jalf

Répondre

3

Boost Serialization sérialisera objets C++ dans un flux XML. Je ne sais pas si cela sera automatiquement compatible avec votre service web ou non.

Réponse à un commentaire: Voici un exemple:

#include <boost/serialization/vector.hpp> 
#include <boost/archive/xml_oarchive.hpp> 
#include <fstream> 

class myclass 
{ 
    //... 
private: 
    int var1; 
    double var2; 
    std::vector<int> var3; 

    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & BOOST_SERIALIZATION_NVP(var1); 
     ar & BOOST_SERIALIZATION_NVP(var2); 
     ar & BOOST_SERIALIZATION_NVP(var3); 
    } 
}; 

//... 

myclass myobject; 

//... 

ofstream ofs("filename.xml"); 
if(ofs.good()) { 
    try { 
     boost::archive::xml_oarchive oa(ofs); 
     oa << BOOST_SERIALIZATION_NVP(myobject); 
    }catch(boost::archive::archive_exception& ex){ 
     //... 
    } 
} 

Fondamentalement dans votre classe, vous devez faire boost::serialization::access un ami et assurer la fonction de membre serialize. Certaines astuces sont jouées ici avec la surcharge de l'opérateur & pour agir comme un opérateur de flux dans des directions différentes selon que vous enregistrez ou en charge. Pour la plupart des classes, suivez simplement ce modèle pour toutes les variables membres et ne vous inquiétez pas de ce qui se passe réellement (lisez les docs si vous voulez savoir).

Pour réellement sérialiser l'objet, vous le diffusez simplement dans un objet xml_oarchive qui peut être instancié pour écrire dans n'importe quel objet ostream.

+0

pouvez-vous me donner un petit exemple? Si j'ai: – elisa

+0

MyClass {std :: string name; int i; } * cls; – elisa

+0

comment vais-je sérialiser par exemple cls-> name = "lundi"; – elisa

0

Si vous êtes intéressé, vous pouvez consulter les tampons de protocole de Google. La documentation est également assez bonne pour la même chose: Here

Et ses performances sont bien meilleures que XML.

+0

thx beaucoup ..je vais regarder par-dessus il – elisa

0

Comment compiler l'exemple que vous avez à propos de Boost Serialization?

g++ example.cpp -o example++

renvoie beaucoup d'erreurs (sous Linux: Ubuntu 10.10)

J'ai trouvé le résultat:

g++ example.cpp -lboost_serialization

+0

g ++ -I -c example.cpp

g ++ -L -lboost_filesystem -o example.o

Arunmu

+0

Aussi, vous devez envisager d'ajouter le chemin de votre boost lib à LD_LIBRARY_PATH/LD_LIBRARY_PATH64 (pour 32bit/64bit arch) variable d'environnement – Arunmu

+0

thx ... et qu'en est-il de la version non intrusive? dans le principal comment ajouter les éléments dans le fichier xml? Un exemple de mon code est celui avec gps_position écrit ci-dessus. Passez une bonne journée – justmee