我在类中声明了一个映射,如下所示:
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);
}
};
我希望能够使用boost将其映射到变量。
示例似乎是序列化整个类,我不需要这样做。他们也写了一个文件,这对我来说似乎效率低下,因为我不需要将地图的状态存档到文件中,只是以稍后可以恢复的方式表示它。
现在我有这个来保存地图:
// 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和Karl Knechtel的答案(谢谢!)。除了one之外,这几乎解决了所有错误,这是上述注释行中的boost序列化静态警告。警告是:
[Warning] comparison between signed and unsigned integer expressions
知道如何解决此警告以便编译吗?谢谢!
修改 我的问题是双重的: 我需要添加:BOOST_CLASS_TRACKING(例如,track_never) 我正在序列化整个班级,并尝试反序列化地图。
答案 0 :(得分:1)
看起来您有两个完全独立的stringstream
对象:其中一个接收数据,另一个(没有底层字符串数据),您尝试从中恢复数据。无论如何,stringstream
不是数据存储; string
与fstream
写入磁盘上实际存储的文件大致相同。
抓取您要保存的流的.str()
,并使用它来初始化您读取的流。
答案 1 :(得分:1)
您的信息流的in
和out
值是向后的。此外,您没有使用数据初始化输入流,因此它是空的