C de msgpack classes définies par l'utilisateur - ne peuvent pas obtenir commencé
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,
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);
}