2010-12-14 10 views
1
私は(このWebサービスは、その入力でXMLを必要としていることを意味する)の.NET Webサービスのために入力されたオブジェクトのシリアル化のために使用する必要がありますどのようなライブラリ

?さらに、問題としてのLinux - > C++コード:オブジェクト直列

正確にコードが何であるかをxmlファイルに書き込む際に、非侵入型バージョン(ブートシリアライゼーション)を使用した場合は? (oa<<?)。私はいくつかのソリューションを試しましたが、私はエラーがあるようです。私は実際にoa<< g.と言うことはできません。

#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ご質問に適切なタグを使用します。より良いあなたの質問にタグが付いていれば、あなたが見られるチャンスが増えます。 –

+1

完全なC++ SOAPツールキットではなく、シリアライゼーションが必要なのですか? – sdg

+0

@mely: "xml"を生成するだけでは不十分です。あなたが解決しようとしている問題について、さらに質問をする答えを使用しないでください:アドバイス、単に優しい作品 - それは、Webサービスが@mely(SOAPの最も可能性の高いいくつかの種類) – jalf

答えて

3

Boost Serialization XMLストリームにC++オブジェクトをシリアライズします:ここでは

は、コードがあります。私はそれが自動的にあなたのwebserviceと互換性があるかどうかわからない。コメントする

回答:ここで は一例です。

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

は、基本的にはあなたのクラスの中、あなたはboost::serialization::access友人を作り、メンバ関数serializeを提供する必要があります。いくつかのトリックは、あなたが保存またはロードされているかどうかに応じて異なる方向に流れオペレーターとして機能する&演算子をオーバーロードして、ここで演奏されています。ほとんどのクラスでは、すべてのメンバー変数についてこのパターンに従ってください。実際に何が起こっているか心配する必要はありません(知りたい場合は、ドキュメントを読んでください)。

オブジェクトを実際にシリアル化するには、xml_oarchiveオブジェクトにストリームします。このオブジェクトは、ostreamオブジェクトに書き込むようにインスタンス化できます。

+0

私は簡単な例を教えていただけますか?私が持っている場合: – elisa

+0

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

+0

私はどのようにしてシリアル化しますか?cls-> name = "monday"; – elisa

0

あなたが興味を持っている場合は、Googleのプロトコル・バッファーを見てすることができます。ドキュメントは同じものにもかなり良いです: Here

そしてその性能はXMLよりはるかに優れています。

+0

thx a lot ..私はそれに目を通すだろう – elisa

0

どのように私はあなたがブーストシリアル化について持っている例をコンパイルするには?

g++ example.cpp -o example++

(Linux上:のUbuntu 10.10)エラーの多くを返す

私が結果が見つかりました:

g++ example.cpp -lboost_serialization

+0

グラム++ -I <後押しするパス> -c example.cpp

G ++ -L <後押しするパスのlibs> -lboost_filesystem -o example.oまた

Arunmu

+0

あなたはのパスを追加することを検討する必要がありますlibをLD_LIBRARY_PATH/LD_LIBRARY_PATH64(32ビット/ 64ビットアーチの場合)に変更してください。 – Arunmu

+0

thx..and intrusiveなバージョンはどうですか?メインでどのようにXMLファイルの要素を追加するには?私のコードの例は、上記のgps_positionを持つものです。すてきな一日を – justmee

関連する問題