Как установить msgpack пользовательский класс C ++ с POD-массивами?

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

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

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

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

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

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

11

Решение

Благодаря парню, который ответил на мой вопрос, я почувствовал обиду и изучил фактическую недокументированную кодовую базу 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 {

}
};
13

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]