Boost-Serialisierung von Objekt mit Landkarte (mit Objekt-Werte) und Multimap (mit std::string Werte): was wird benötigt?

Unten finden Sie eine main () - und zwei sehr einfache Klassen. Dann per Boost-Serialisierung (und das, was gezeigt wird) meine Fragen sind:

1) Ist der Klasse B müssen den normalen überladenen stream Einfüge-Operatoren '<< " und " >>' definiert werden? Derzeit in meinem richtigen code ist es nicht diese.

2) ist der Klasse A in den store() und load () - Methoden müssen Durchlaufen Sie die map und multimap-Container explizit speichern/laden Ihre Schlüssel:Wert-Paare explizit?
z.B. so etwas wie:

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
}

Ich davon ausgehen, dass ich nicht brauchen, um dies zu tun, aber bin nicht sicher.

3) Angenommen, die Klasse B hat nur die zwei Mitglieder-Daten gezeigt, braucht es eine default contructor enthalten explizit? (im Gegensatz zu den impliziten Standard-Konstruktor)

4) ist B eine Option Vorrang für den Vergleichsoperator '>'? Ich gehe davon aus, dass es nicht da das ist eine sehr einfache Klasse.

Schließlich, alle anderen Kommentare pro nichts, was ich nicht habe decken ist erwünscht!

Beispiel-code für meine oben genannten Fragen:

//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;
    }
}
InformationsquelleAutor bhartsb | 2009-11-04
Schreibe einen Kommentar