C ++ msgpack Пользовательские классы - не могу начать - PullRequest
1 голос
/ 17 февраля 2012

Я просматривал краткое руководство по C ++ для msgpack.

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

Там есть следующий фрагмент кода:

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

Я хочу сериализовать вектор объектов myclass.

Я пробовал следующее:

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

...

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

Но это не работает («ошибка: нет совпадения для вызова»)

также, если я сделаю:

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

это не будет работать, так как str1 и str2 являются частными.

Как правильно использовать этот макрос MSGPACK_DEFINE (...)? Кажется, я ничего не могу найти в Интернете.

Большое спасибо,

Ответы [ 2 ]

1 голос
/ 01 апреля 2013
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);
}
0 голосов
/ 05 апреля 2012

MSGPACK_DEFINE() определяет некоторые методы, реализующие упаковку и распаковку для вашего класса. То, что вы положили внутрь (), это список членов, которые вы хотите сериализовать.

После этого вы можете упаковать и распаковать свой класс так же, как вы бы упаковали или распаковали int. Так что пример должен работать.

Вы можете попробовать удалить вектор и упаковать только один объект - думаю, это упростит его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...