序列化STL结构体地图

5
我正在尝试对一个STL map进行序列化,其中键和值都是结构体。当键是结构体而值是int时,附加的代码可以正常工作。然而,我在设置序列化函数以处理结构体值时遇到了问题。有什么建议吗?谢谢 - Andrew.
#include <string>
#include <fstream>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <iostream>
#include <chrono>
#include <sstream>
#include <functional>

#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/unordered_map.hpp>
#include <boost/serialization/version.hpp>

using namespace std;

struct portfolio_data {
    double a;
};

struct portfolio_key {
    long id;
    string name;
};

struct portfolio_compare
{
    bool operator() ( portfolio_key k1, portfolio_key k2 ) const
    {
        return (
                   ( k1.id < k2.id ) ||
                   ( ( k1.id == k2.id ) && ( k1.name < k2.name ) )
               );
    }
};

typedef map<portfolio_key, int, portfolio_compare> portfolio_map;

//------------------------------------------------------------------------

template<class Archive>
void serialize( Archive& ar, portfolio_key& key, const unsigned int version )
{
    ar & boost::serialization::make_nvp( "id", key.id );
    ar & boost::serialization::make_nvp( "name", key.name );
}

//------------------------------------------------------------------------

void save( portfolio_map& map_var, const std::string& file_name )
{
    ofstream ofs( file_name.c_str(), ios::out | ios::binary );
    boost::archive::binary_oarchive ba( ofs ); // works for text too
    ba << BOOST_SERIALIZATION_NVP( map_var );
}

//------------------------------------------------------------------------

portfolio_map load( const std::string& file_name )
{
    portfolio_map map_var;
    ifstream ifs( file_name.c_str(), ios::in | ios::binary );
    boost::archive::binary_iarchive ba( ifs );
    ba >> BOOST_SERIALIZATION_NVP( map_var );
    return map_var;
}

//------------------------------------------------------------------------

int main( void )
{
    portfolio_map map1;

    for ( long i = 0; i < 10; ++i )
    {
        portfolio_key k;
        k.id = i;
        k.name = "AAAAA";

        portfolio_data d;
        map1[k] = i;
    }

    save( map1, "map.bin" );

    portfolio_map map2;
    map2 = load( "map.bin" );

    cout << map2.size() << endl;
}

如果您为结构体的每个数据成员创建单独的键会怎样呢?例如,要序列化portfolio_key,您将拥有"key-id"和"key-name"两个键。 - rahul.deshmukhpatil
1个回答

1
你只是忘记为你的值结构体定义序列化方法了,这就是全部:
template<class Archive>
void serialize( Archive& ar, portfolio_data& value, const unsigned int  version )
{
    ar & boost::serialization::make_nvp( "a", value.a );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接