C ++ MSGPACK пользовательские классы - не могу начать

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

  •  27-10-2019
  •  | 
  •  

Вопрос

Я смотрел руководство по быстрому началу 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 (...) правильно? Кажется, я не могу найти ничего в Интернете.

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

Это было полезно?

Решение

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

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

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

Другие советы

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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top