IT笔记 · 2013年11月19日

Msgpack 的c/c++实现

  • github或者官网首页给的sorceforge站的链接在win下都有问题,能用或者说至少没有编译错误的实现在 http://msgpack.org/releases/cpp/ 下,选择最新的就行。
  • msgpack 的c++实现似乎没有针对[key,value]的value做类型范化。
  • 类型范化可以使用msgpack c++自带的object,但是需要使用这个 object(T* ,zone* )来构造,才能让object在转化时存自己的值以及转化各种嵌套类。zone初看代码只是简单的mem管理,应该可以定义一个zone,多个object复用。
  • 如果不是纠结[key,value]的value范化,直接在自定义数据结构或类里使用MSGPACK_DEFINE()宏就简单多了。
  • 添了个object(const object&, zone*)的构造,这样value是object的map<string,object>可以顺利转换成object。
  • c的接口msgpack_unpack函数不能复制raw即字符串类型的数据,而c++的几个msgpack::unpack函数都基于它,所以得到的object或unpacked都只带着字符串的指针,实际字符串空间并不在zone内,还呆在被unpack的sbuffer里,在sbuffer释放内存后就会丢失!
  • c++封装的unpacker类使用麻烦,一个月前还有mem leak的fix,未使用,不知道效果怎样。
  • 折腾了一个礼拜, msgpack的c++实现是个文档注释不全、使用模板不好调试、内部隐藏着智能指针陷阱的代码,使用前请三思。c的实现代码应该已经够稳,但文档注释也不全,不过c的接口符合开源库惯例,上手应比c++快。