bha*_*tsb 8 c++ serialization boost map
请参阅下面的main()和两个非常简单的类.然后根据Boost序列化(以及显示的内容),我的问题是:
1)B类是否需要定义正常的重载流插入运算符'<<'和'>>'?目前在我的真实代码中它没有这些.
2)store()和load()方法中的类A是否需要明确地迭代map和multimap容器,明确地存储/加载它们的key:value对?例如:
void A::store(const char* filename){
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
std::map< std::string, B >::iterator it;
BMap.size();
oa << BMap.size();
for( it = BMap.begin(); it != BMap.end(); it++ ){
oa << it->first;
oa << it->second;
}
//similar for strMultimap
}
Run Code Online (Sandbox Code Playgroud)
我认为我不需要这样做,但我不确定.
3)假设B类只显示了两个数据成员,是否需要明确包含默认的构造函数?(与隐式默认构造函数相对)
4)B是否需要为比较运算符'>'覆盖?我认为它不是因为这是一个非常简单的类.
最后,对于我未能涵盖的任何内容的任何其他评论表示赞赏!
上述问题的示例代码:
//includes ommitted
int main() {
std::string file("test.dat");
A * pA = new A;
pA->store(file.c_str());
pA->fillMaps();
//release data
pA->load(file.c_str());
return 0;
}
//includes ommitted
class A
{
friend class boost::serialization::access;
public:
std::map< std::string, B > BMap;
std::multimap< std::string, std::string > strMultimap;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & BMap;
ar & strMultimap;
}
void store(const char* filename){
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
oa << this;
}
void load(const char* filename){
std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
ia >> this;
}
void fillMaps(){
//code to allocate B objects and put them in BMap and fill strMultimap with whatever number of key:value pairs
}
class B
{
friend class boost::serialization::access;
public:
std::string str;
unsigned int num;
B::B(void)
: str("a string")
, num(7)
{
}
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & str;
ar & num;
}
}
Run Code Online (Sandbox Code Playgroud)
1)B类不需要流运算符,但它确实需要一个serialize()方法。我必须用BOOST_SERIALIZATION_NVP(名称值对)宏来包装序列化:
ar & BOOST_SERIALIZATION_NVP(someNamedValue); // use this macro for everything you want to name
Run Code Online (Sandbox Code Playgroud)
可能有一种方法可以避免命名地图,但我不知道这是如何做到的。
2) 不,A 类不需要特定于映射的序列化代码。只要确保包含<boost/serialization/map.hpp>.
3)隐式默认构造函数应该没问题。仅当 a) 您已经提供了非默认构造函数或 b) 您想要更改默认构造函数的行为时,才需要显式默认构造函数。
4) 不需要运算符 < :)
这是一些已编译的示例代码,但我尚未运行:
#include <boost/serialization/map.hpp>
struct A
{
struct B
{
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
}
};
typedef std::map<int, SomeClass> MyMap;
MyMap myMap;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(myMap);
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5993 次 |
| 最近记录: |