序列化结构的STL映射

时间:2015-12-08 15:37:50

标签: c++ dictionary serialization struct stl

我试图序列化一个STL映射,其中键和值是结构。当键是结构且值为int时,附加的代码工作正常。但是,我在设置序列化函数以处理结构值时遇到问题。有关如何做到这一点的任何建议吗?

非常感谢 - 安德鲁。

#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;
}

1 个答案:

答案 0 :(得分:1)

您忘记为您的价值结构定义serialize,这就是全部:

template<class Archive>
void serialize( Archive& ar, portfolio_data& value, const unsigned int  version )
{
    ar & boost::serialization::make_nvp( "a", value.a );
}