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;
}
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". –