Frage

Ich habe mir die C ++-Schnellstart-Handbuch für MSGPack angesehen.

http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387

Dort gibt es den folgenden Code -Snippet:

#include <msgpack.hpp>
#include <vector>
#include <string>

class myclass {
private:
    std::string str1;
    std::string str2;
public:
    MSGPACK_DEFINE(str1,str2);
};

int main(void) {
        std::vector<myclass> vec;
        // add some elements into vec...
        /////
        /* But what goes here??? */
        /////

        // you can serialize myclass directly
        msgpack::sbuffer sbuf;
        msgpack::pack(sbuf, vec);

        msgpack::unpacked msg;
        msgpack::unpack(&msg, sbuf.data(), sbuf.size());

        msgpack::object obj = msg.get();

        // you can convert object to myclass directly
        std::vector<myclass> rvec;
        obj.convert(&rvec);
}

Ich möchte einen Vektor von Mycass -Objekten serialisieren.

Ich habe Folgendes ausprobiert:

...
vector<myclass> rb;
myclass mc;

...

int main(){
    ...
    mc("hello","world");
    rb.push_back(mc)
    ...
}

Dies funktioniert jedoch nicht ("Fehler: keine Übereinstimmung für Anruf")

Auch wenn ich:

mc.str1="hello"
mc.str2="world"

Es wird nicht funktionieren, da Str1 und Str2 privat sind.

Wie benutze ich dieses msgpack_define (...) -Makro richtig? Ich kann anscheinend online nichts finden.

Danke vielmals,

War es hilfreich?

Lösung

MSGPACK_DEFINE() Definiert einige Methoden, die Packungen und Auspacken für Ihre Klasse implementieren. Was du hineingesteckt hast () ist eine Liste der Mitglieder, die Sie serialisieren möchten.

Danach können Sie Ihre Klasse so packen und auspacken, wie Sie es packen oder auspacken würden int. Das Beispiel sollte also funktionieren.

Sie können versuchen, den Vektor zu entfernen und nur ein einzelnes Objekt zu packen - ich denke, das würde ihn vereinfachen.

Andere Tipps

class myclass {
    private:
        std::string str1;
        std::string str2;
    public:
        myclass(){};
        myclass(string s1,string s2):str1(s1),str2(s2){};
        MSGPACK_DEFINE(str1,str2);
};

int main(int argc, char **argv)
{
    std::vector<myclass> vec;
    myclass m1("m1","m2");
    vec.push_back(m1);

    // you can serialize myclass directly
    msgpack::sbuffer sbuf;
    msgpack::pack(sbuf, vec);

    msgpack::unpacked msg;
    msgpack::unpack(&msg, sbuf.data(), sbuf.size());

    msgpack::object obj = msg.get();

    // you can convert object to myclass directly
    std::vector<myclass> rvec;
    obj.convert(&rvec);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top