2011-10-20 2 views
-2

は、私は次のようにクラス内で宣言したマップがあります。ブーストを使用して(ネストされた)マップを変数にシリアル化する方法は?

class Example { 
    public: 
     Example() 
     { 
      std::map< std::string, std::string > map_data; 
      map_data["LOCATION"] = "USA"; 
      map_data["WEBSITE"] = "http://www.google.com/"; 

      custom_map["nickb"] = map_data; 
     } 
     std::map< std::string, std::map< std::string, std::string > > get_map() { return custom_map; } 
    private: 
     std::map< std::string, std::map< std::string, std::string > > custom_map; 

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

をそして私はブーストを使用して変数にだけマップ、それをシリアル化することができるようにしたいと思います。

例は、私が行う必要はありません、クラス全体を、直列化されているように見えます。彼らはファイルにも書き込んでいますが、マップの状態をファイルに保存する必要はなく、後で復元できる方法で表現するだけで、私にとっては効率が悪いようです。

今私はマップを保存するためにこれを持っている:

// Create an Example object 
Example obj; 

// Save the map 
std::stringstream outstream(std::stringstream::out | std::stringstream::binary); 
boost::archive::text_oarchive oa(outstream); 
oa << obj; // <-- BOOST SERIALIZATION STATIC WARNING HERE 

// Map saved to this string: 
std::string saved_map = outstream.str(); 

そして、それを復元するには、この:

// Now retore the map 
std::map< std::string, std::map< std::string, std::string > > restored_map; 
std::stringstream instream(saved_map, std::stringstream::in | std::stringstream::binary); 
boost::archive::text_iarchive ia(instream); 
ia >> restored_map; 

std::map< std::string, std::string > map_data = restored_map.find("nickb")->second; 
std::cout << "nickb " << map_data["LOCATION"] << " " << map_data["WEBSITE"] << std::endl; 

しかし、それは動作しません。誰でも私にいくつかのヒントを教えてもらうか、マップのシリアライズと復元の方法を教えてもらえますか?

ありがとうございます。

編集: 私はK-BALLOとカールKnechtel(ありがとうございます!)から回答をより詳細に私の例を更新し、考慮されてきました。これは、1つを除いてほとんどすべてのエラーを解決しました。これは、上記のコメント行でブーストシリアライゼーションの静的警告です。警告は次のとおりです。

[Warning] comparison between signed and unsigned integer expressions 

この警告を解決してコンパイルするにはどうすればよいですか?ありがとう!

編集: BOOST_CLASS_TRACKING(例、track_neverを)そして、私はクラス全体をシリアル化し、マップをアンシリアライズしようとしていた:私は追加する必要 : 私の問題は、二重でした。

+1

定義空。 –

+0

私はより良い例で質問を更新し、Karl KnechtelとK-balloのコメントを掲載しました。ありがとう! – nickb

+0

警告は(通常)コンパイルを妨げません。それは実際にはコンパイルされていないのですか?もしそうなら、それは本当にただ一つの警告ですか? – ssube

答えて

1

stringstreamという2つのオブジェクトが完全に分離されているように見えます。そのうちの1つはデータを受け取り、もう1つは(元の文字列データなし)データの復元を試みます。とにかくstringstreamはデータストレージではありません。 stringは、fstreamが実際のストレージであるディスク上のファイルに書き込むのとほとんど同じです。

グラブあなたが保存し、そしてあなたから読み出されたストリームを初期化するためにそれを使用しているストリームの.str()。あなたのストリームの

+0

アドバイスありがとう - 私は質問を更新し、あなたの答えを組み込んだが、まだコンパイルされません。 – nickb

1

inout値は後方です。また、あなたがデータを持つ入力ストリームを初期化していないので、その「動作しない」

関連する問題