提升包含Map(带有对象值)和Multimap(带有std :: string值)的Object的序列化:需要什么?

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)

Ale*_*thy 4

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)