Warum/wie kann boost::serialization auf die serialize Methode zugreifen?



  • Moin,

    ich habe mir Boost::Serialization angeschaut und mir ist aufgefallen, das es keine gemeinsame Basis-Klasse benötigt. Im Tutorial wird z.B. folgende Klasse gezeigt:

    class gps_position
    {
    private:
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & degrees;
            ar & minutes;
            ar & seconds;
        }
        int degrees;
        int minutes;
        float seconds;
    };
    

    Aber wie und warum kann Boost::Serialization auf die serialize Methode zugreifen?

    MfG,
    Hilefoks



  • Welche Probleme siehst du? Warum sollte die Methode nicht einfach aufgerufen werden koennen?



  • Du gibst einer Klasse boost::serialization::access Totalzugriff auf alle deiner Member, dazu gehört auch die private serialize Methode...



  • Danke für die Antworten. Leider beantwortet das meine Frage allerdings nicht. Vielleicht habe ich mich auch nicht klar genug ausgedrückt.

    Die friend Deklaration ist mir klar. Darum geht es mir nicht, die Frage bleibt auch wenn die serialize Methode public wäre.

    Die Frage ist, wie kann Boost::Serialize die Methode aufrufen, wenn es doch den Typ der Klasse nicht kennen kann und es keine gemeinsame Basisklasse gibt, die es kennen könnte.

    Der "Trick" muss ja damit zu tun haben, das die serialize Methode eine Template-Methode ist. Aber wie funktioniert das?



  • templates? Der Compiler kann dann selbst bestimmen, was der Typ des Arguments ist, wenn operator & serialize deines Objects aufruft.



  • Template ... Aber wie funktioniert das?

    Indem du in einem Buch drueber liesst: The C++ Programming Language (4te Auflage), Kapitel 23 und folgende.



  • @otze: Danke für die Antwort - leider verstehe ich sie aber nicht.

    Ich erläutere meine Frage nochmals etwas ausführlicher.

    Angenommen, ich möchte einen Satz von Klassen serialisieren können, auch solche Klassen, die ich noch gar nicht kennen kann.

    class A {};
    class B {};
    class C {};
    ...
    

    Ich könnte eine serialize() Methode in allen Klassen implementieren.

    class A { public: void serialize(...); };
    class B { public: void serialize(...); };
    class C { public: void serialize(...); };
    ...
    

    Aber das alleine Hilft mir noch nicht sehr viel weiter, wenn ich den Typ der Klasse nicht kennen kann. Also brauche ich eine gemeinsame Basisklasse:

    class Serialisable { public: virtual void serialize(...) = 0; };
    class A : public Serialisable { public: void serialize(...) overide; };
    class B : public Serialisable { public: void serialize(...) overide; };
    class C : public Serialisable { public: void serialize(...) overide; };
    ...
    

    Nun kann ich auch neue Klassen serialisieren, solange sie von Serialisable erben.

    Boost::Serialize macht das aber offensichtlich anders, insbesondere ohne gemeinsame Basisklasse. Wie funktioniert das?



  • Hilefoks schrieb:

    Wie funktioniert das?

    Zum hundertsten mal: Templates.



  • Okay, nehmen wir die Klassen A, B und C:

    class A { public: void serialize(std::ostream&); };
    class B { public: void serialize(std::ostream&); };
    class C { public: void serialize(std::ostream&); };
    

    wenn wir nun die Klassen serialisieren wollen, können wir nun eine gemeinsame Basisklasse oder Templates benutzen. Templates haben den Vorteil, dass man beliebige Klassen damit verwenden kann, solange das Interface gleich bleibt.

    #include <fstream>
    class Serializer
    {
    public:
        Serializer(std::string outfile)
        : m_file(outfile, std::ios::app)
        {...}
    
        template<typename T>
        void serialize(T& in) // Wir akzeptieren beliebige Typen...
        {
            in.serialize(file); // ...solange sie die serialize-Methode bereitstellen
        }
    private:
        std::ofstream m_file;
    };
    

    (Code nicht getestet, soll aber auch nur das Prinzip verdeutlichen)

    Natürlich steckt bei Boost viel mehr Template Magic dahinter


Log in to reply