Zobacz poniżej główną() i dwie bardzo proste klasy. Następnie na serializację Boost (i to, co jest pokazane), moje pytania są następujące:Boost Serializing obiektu zawierającego mapę (z wartościami obiektów) i Multimap (z wartościami std :: string): co jest potrzebne?
1) Czy klasa B wymaga zdefiniowania operatorów o standardowej przeciążonej transmisji strumieniowej "< <" i ">>"? Obecnie w moim prawdziwym kodzie nie ma ich.
2) Czy klasa A w metodach store() i load() musi przejrzeć mapę i zbiorniki multimap wyraźnie, przechowując/ładując ich klucz: parę wartości explicitely? np. coś w rodzaju:
void A::store(const char* filename){
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
std::map< std::string, B >::iterator it;
BMap.size();
oa << BMap.size();
for(it = BMap.begin(); it != BMap.end(); it++){
oa << it->first;
oa << it->second;
}
//similar for strMultimap
}
Zakładam, że nie muszę tego robić, ale nie jestem pewien.
3) Zakładając, że klasa B zawiera tylko dwa elementy danych, czy potrzebny jest domyślny kontroler dołączony explicitely? (w przeciwieństwie do ukrytego domyślnego konstruktora)
4) Czy B musi mieć nadmiar dla operatora porównania ">"? Zakładam, że tak nie jest, ponieważ jest to bardzo prosta klasa.
Wreszcie, wszelkie inne komentarze na wszystko, czego nie udało mi się pokonać, są doceniane!
Przykładowy kod dla moich powyższych pytań:
//includes ommitted
int main() {
std::string file("test.dat");
A * pA = new A;
pA->store(file.c_str());
pA->fillMaps();
//release data
pA->load(file.c_str());
return 0;
}
//includes ommitted
class A
{
friend class boost::serialization::access;
public:
std::map< std::string, B > BMap;
std::multimap< std::string, std::string > strMultimap;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & BMap;
ar & strMultimap;
}
void store(const char* filename){
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
oa << this;
}
void load(const char* filename){
std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
ia >> this;
}
void fillMaps(){
//code to allocate B objects and put them in BMap and fill strMultimap with whatever number of key:value pairs
}
class B
{
friend class boost::serialization::access;
public:
std::string str;
unsigned int num;
B::B(void)
: str("a string")
, num(7)
{
}
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & str;
ar & num;
}
}
@bhartsb - zrobił powyżej rozwiązanie pracował dla ciebie .. bo Mam też do czynienia z tym samym problemem .. – sia