2015-12-08 19 views
5

Tôi đang cố gắng tuần tự hóa bản đồ STL trong đó khóa và giá trị là cấu trúc. Mã được đính kèm hoạt động tốt khi khóa là một cấu trúc và giá trị là một int. Tuy nhiên, tôi đang gặp sự cố khi thiết lập hàm tuần tự hóa để xử lý giá trị cấu trúc. Bất kỳ đề xuất nào về cách thực hiện điều này?Nối tiếp bản đồ cấu trúc STL

Rất cám ơn - 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; 
} 
+0

gì xảy ra nếu bạn tạo các khóa riêng biệt cho mỗi thành viên dữ liệu của cấu trúc? tức là để serialize portfolio_key, bạn sẽ có khóa "key-id" và key "key-name". –

Trả lời

1

Bạn chỉ cần quên để xác định serialize cho struct giá trị của mình, đó là tất cả:

template<class Archive> 
void serialize(Archive& ar, portfolio_data& value, const unsigned int version) 
{ 
    ar & boost::serialization::make_nvp("a", value.a); 
} 
Các vấn đề liên quan