Klassenattribute in Bytearray speichern



  • Ich habe eine Situation, in der ich die Attribute einer Klasse in einen einfachen Array aus Bytes speichern möchte, aber es handelt sich nicht um POD.
    Beispiel:

    struct Attributes {
        int attr1;
        char attr2;
        std::deque <char> attr3;
    };
    
    class A {
    private:
        Attributes Attr;
    public:
        Attributes GetAttributes() const;  // gibt Attr zurück
    };
    
    int main () {
        const unsigned short SIZE = /* something */
        char Buffer[SIZE];
        A Instance;
        // Hier Konvertierung | Instance.GetAttributes() -> Buffer
    }
    

    Ich würde ungern jedes einzelne Element hinzufügen, da ich jetzt schon weiß, dass ich die Attribute um Elemente erweitern werde und wenn ich dann mal vergesse die Funktion für die Konvertierung zu erweitern...
    Kann ich es denn sinnvoll anders machen?

    EDIT: Ich glaube nicht, dass reinterpret_cast und memcpy mich weiterbringen... oder?

    EDIT 2: Ich vergaß zu sagen, dass es auch rückwärts wieder laufen muss 😉



  • Na ja. Wie genau meinst du das? memcpy drüber und fertig funktioniert natürlich, allerdings hast du dann im Puffer statt den Elementen der deque nur ein paar Pointer stehen. Ich glaube das ist nicht das, was du willst. Insofern würde ich sagen ja, du musst dir für jeden Typ ein Layout überlegen, und dafür Ein- und Ausgabeoperationen zur verfügung stellen. Die Nutzung davon ist dann auch ganz hübsch, weil ja einfach die richtige Überladung genommen wird. Diese Funktionen allerdings sind wohl nicht besonders hübsch - und du musst das halt wirklich für jeden Typ einzeln implementieren. (Bei Templates natürlich über Templates.)

    Ansonsten kann ich diese Seite empfehlen, ich glaube, das ist das was du willst: http://www.parashift.com/c++-faq-lite/serialization.html



  • Das ganze lieber als Elementfunktion oder als nicht befreundete Nichtelement-funktion?
    (Also angenommen ich bastele eine Funktion serialize(/* const Attributes& Obj */))

    Und du hast recht, Zeiger würden mir nicht helfen :), da das ganze über einen Socket raus geht und irgendwo anders wieder zurückgebastelt wird. Ich denke ich packe die Sachen in einen Stream (binary).



  • Hm.. schwer zu sagen. Es gehört irgendwie nicht so richtig zum Interface einer Klasse. Andererseits, sobald Vererbung im Spiel ist, wird das nervig mit freien Funktionen. Insofern würde ich jetzt zu Methoden tendieren, aber so ganz sicher bin ich mir da nicht.


Anmelden zum Antworten