2010-12-14 10 views
1

Welche Bibliothek sollte ich für eine Objekt-Serialisierung verwenden, die die Eingabe für einen .net-Webdienst ist (was bedeutet, dass dieser Webservice ein XML-Objekt an seinem Eingang benötigt)?Linux -> C++ - Code: Serialisierung von Objekten

Als weitere Frage:

Bei der Verwendung von Non Intrusive (Boot Serialisierung), wenn in der XML-Datei zu schreiben, was ist das genau Code? (oa<<?). Ich habe einige Lösungen versucht, aber es scheint, dass ich einen Fehler habe. Ich kann nicht wirklich oa<< g. sagen. Hier

ist der 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

@mely verwendet richtige Tags für Ihre Fragen:

ich das Ergebnis gefunden desto besser Fragen werden markiert, je mehr Chancen Sie haben, um gesehen zu werden. –

+1

Sind Sie sicher, dass Sie nur Serialisierung möchten - und nicht ein komplettes C++ - SOAP-Toolkit? – sdg

+0

@mely: Es ist nicht genug, "ein xml" zu generieren. Es muss dem Format entsprechen, das der Webservice erwartet (höchstwahrscheinlich irgendeine Art von SOAP) – jalf

Antwort

3

Boost Serialization C serialisiert wird ++ in einen XML-Stream-Objekte. Ich weiß nicht, ob es automatisch mit Ihrem Webservice kompatibel ist oder nicht.

Antwort Kommentar: Hier ein Beispiel:

#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){ 
     //... 
    } 
} 

Grundsätzlich in Ihrer Klasse benötigen Sie serializeboost::serialization::access ein Freund und geben Sie die Member-Funktion zu machen. Hier werden einige Tricks gespielt, bei denen der Operator & überladen wird, um als Stream-Operator in verschiedene Richtungen zu agieren, abhängig davon, ob Sie speichern oder laden. Für die meisten Klassen folgen Sie einfach diesem Muster für alle Mitgliedsvariablen und machen sich keine Gedanken darüber, was tatsächlich passiert (lesen Sie die Dokumentation, wenn Sie das wissen wollen).

Um das Objekt tatsächlich zu serialisieren, streamen Sie es einfach an ein xml_oarchive-Objekt, das instanziiert werden kann, um jedes Objekt ostream zu schreiben.

+0

Können Sie mir ein kurzes Beispiel geben? Wenn ich folgendes habe: – elisa

+0

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

+0

Wie serialisiere ich zum Beispiel cls-> name = "montag"; – elisa

0

Wenn Sie interessiert sind, dann können Sie Protokollpuffer von Google betrachten. Die Dokumentation ist auch ziemlich gut für das gleiche: Here

Und seine Leistung ist viel besser als XML.

+0

thx viel ..Ich werde über sie aussehen – elisa

0

Wie kompiliere ich das Beispiel, das Sie über Boost Serialization haben?

g++ example.cpp -o example++

gibt eine Menge von Fehlern (auf Linux: Ubuntu 10.10):

g++ example.cpp -lboost_serialization

+0

g ++ -I -c example.cpp

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

Arunmu

+0

Auch müssen Sie hinzufügen den Pfad, Ihre Boost lib zu LD_LIBRARY_PATH/LD_LIBRARY_PATH64 (für 32bit/64bit arch) Umgebungsvariable – Arunmu

+0

thx..und was ist mit non intrusive Version? im Wesentlichen, wie man die Elemente in der XML-Datei hinzufügt? Ein Beispiel für meinen Code ist der mit der oben beschriebenen gps_position. Ich wünsche ihnen einen wunderbaren Tag – justmee

Verwandte Themen