2012-02-17 2 views
1

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

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

+0

http://msgpack.sourcearchive.com/documentation/0.5.4-1/msgpack__test_8cpp-source.html может помочь;) – tuergeist

ответ

0

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

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

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

1
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); 
} 
Смежные вопросы