2015-12-08 13 views
5

Sto provando a serializzare una mappa STL in cui la chiave e il valore sono strutture. Il codice allegato funziona correttamente quando la chiave è una struttura e il valore è un int. Tuttavia, sto riscontrando problemi nell'impostare la funzione serialize per gestire un valore di struttura. Qualche suggerimento su come farlo?Serializzazione di una mappa STL di strutture

Mille grazie - 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

cosa succede se si crea chiave separata per ogni membro di dati della struct? Ad esempio, per serializzare il tasto portfolio_key, avrai le chiavi "key-id" e il tasto "key-name". –

risposta

1

Hai solo dimenticato di definire serialize per la vostra struct valore, questo è tutto:

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