如何为用户定义的C ++类提供所有三个函数:msgpack_pack
,msgpack_unpack
和msgpack_object
(以及它们的含义,确切地说是什么?)(以同样的方式MSGPACK_DEFINE
为包含普通旧数据数组(例如dobule[]
或char[]
)的非数组POD / UD类型执行此操作,因此我的类可以更好地使用更高级别 - 级别类,在地图或向量中包含此类?
是否有任何为您自己的类或至少msgpack C ++ api文档实现它们的示例?
我发现可能的api参考的唯一链接是http://redmine.msgpack.org/projects/msgpack/wiki;但它现在已经死了。
说,我有一个类似
的结构struct entity {
const char name[256];
double mat[16];
};
msgpack_ *成员的功能是什么?
答案 0 :(得分: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 {
}
};