C de msgpack classes définies par l'utilisateur - ne peuvent pas obtenir commencé

StackOverflow https://stackoverflow.com/questions/9326862

  •  27-10-2019
  •  | 
  •  

Question

J'ai regardé le C ++ guide de démarrage rapide pour msgpack.

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

, il y a le code suivant:

#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);
}

Je veux sérialiser un vecteur de MaClasse objets.

J'ai essayé ce qui suit:

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

...

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

Mais cela ne fonctionne pas ( « Erreur: aucune correspondance pour l'appel »)

aussi, si je fais:

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

il ne fonctionnera pas comme str1 et str2 sont privées.

Comment utiliser ce MSGPACK_DEFINE (...) macro correctement? Je ne peux pas sembler trouver quoi que ce soit en ligne.

Merci,

Était-ce utile?

La solution

MSGPACK_DEFINE() définit des méthodes de mise en œuvre emballage et le déballage de votre classe. Ce que vous mettez à l'intérieur () est une liste des membres que vous souhaitez sérialisé.

Après cela, vous pouvez emballer et déballer votre classe comme vous emballer ou déballer un int. Ainsi, l'exemple devrait fonctionner.

Vous pouvez essayer d'enlever le vecteur et emballer un seul objet - je pense que cela simplifier

.

Autres conseils

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top