2013-05-11 1 views
11

Каким образом можно предоставить все три функции: msgpack_pack, msgpack_unpack и msgpack_object (также, каковы их значения, точно?) Для пользовательского класса C++ (точно так же MSGPACK_DEFINE делает это для не-массива POD/UD), содержащие массивы Plain Old Data (например, dobule[] или char[]), поэтому мой класс будет хорошо играть с классами более высокого уровня, охватывая этот класс на карте или векторе?Как msgpack-пользовательский класс C++ с POD-массивами?

Есть ли примеры реализации их для вашего собственного класса или, по крайней мере, документации msgpack C++ api?

Единственная ссылка на возможную ссылку на api, которую я нашел, - http://redmine.msgpack.org/projects/msgpack/wiki; но теперь он мертв.

Скажем, у меня есть на структуру как

struct entity { 
    const char name[256]; 
    double mat[16]; 
}; 

Что бы msgpack_ * функции-члены для него?

+0

Ваш вопрос является хорошим и спросил разумным образом. Вы также, по крайней мере, попытались прочитать документы. Некоторым людям дадут вождение вниз - вероятно, потому, что они не могут ответить на вопрос и испытывают неуважение к отсутствию при подсчете некоторых повышений. Бу им. +1 для вас. –

ответ

13

Благодаря парню, который спросил мой вопрос, я почувствовал жалобу и изучил реальную недокументированную кодовую базу msgpack. Вот пример упомянутых ранее функций с рода объяснения, в количестве мой (значительно неполным из-за отсутствия документации) понимание:

struct entity { 
    char name[256]; 
    double mat[16]; 

    // this function is appears to be a mere serializer 
    template <typename Packer> 
    void msgpack_pack(Packer& pk) const { 
    // make array of two elements, by the number of class fields 
    pk.pack_array(2); 

    // pack the first field, strightforward 
    pk.pack_raw(sizeof(name)); 
    pk.pack_raw_body(name, sizeof(name)); 

    // since it is array of doubles, we can't use direct conversion or copying 
    // memory because it would be a machine-dependent representation of floats 
    // instead, we converting this POD array to some msgpack array, like this: 
    pk.pack_array(16); 
    for (int i = 0; i < 16; i++) { 
     pk.pack_double(mat[i]); 
    } 
    } 

    // this function is looks like de-serializer, taking an msgpack object 
    // and extracting data from it to the current class fields 
    void msgpack_unpack(msgpack::object o) { 
    // check if received structure is an array 
    if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } 

    const size_t size = o.via.array.size; 

    // sanity check 
    if(size <= 0) return; 
    // extract value of first array entry to a class field 
    memcpy(name, o.via.array.ptr[0].via.raw.ptr, o.via.array.ptr[0].via.raw.size); 

    // sanity check 
    if(size <= 1) return; 
    // extract value of second array entry which is array itself: 
    for (int i = 0; i < 16 ; i++) { 
     mat[i] = o.via.array.ptr[1].via.array.ptr[i].via.dec; 
    } 
    } 

    // destination of this function is unknown - i've never ran into scenary 
    // what it was called. some explaination/documentation needed. 
    template <typename MSGPACK_OBJECT> 
    void msgpack_object(MSGPACK_OBJECT* o, msgpack::zone* z) const { 

    } 
};