は、私は次のようにクラス内で宣言したマップがあります。ブーストを使用して(ネストされた)マップを変数にシリアル化する方法は?
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を)そして、私はクラス全体をシリアル化し、マップをアンシリアライズしようとしていた:私は追加する必要 : 私の問題は、二重でした。
定義空。 –
私はより良い例で質問を更新し、Karl KnechtelとK-balloのコメントを掲載しました。ありがとう! – nickb
警告は(通常)コンパイルを妨げません。それは実際にはコンパイルされていないのですか?もしそうなら、それは本当にただ一つの警告ですか? – ssube