【发布时间】:2014-04-29 14:30:10
【问题描述】:
我使用MsgPack 作为我为SOCI C++ database access API 创建的自定义后端的一部分。最初,我的一些SOCI 类将MsgPack::sbuffer 对象作为成员变量,但我在SOCI 对象的析构函数中遇到了一些问题——我相信问题与SOCI 引用计数的方式有关它的对象和作为MsgPack 对象基础的内存被多次释放。
为了解决这个问题,我决定将MsgPack::sbuffer 成员变量替换为std::vector<char> 成员变量,并使用pack_raw_body 方法使用它们来填充MsgPack::sbuffers。不幸的是,我也遇到了麻烦。
请考虑以下(伪)代码 sn-p...
msgpack::sbuffer buf1;
msgpack::packer<msgpack::sbuffer> bufPkr1(&buf1);
bufPkr1.pack_array(num);
for (int ndx = 0; ndx < num; ++ndx) {
bufPkr1.pack_array(3);
bufPkr1.pack(std::string("foo"));
bufPkr1.pack(std::string("bar"));
bufPrk1.pack(221);
}
std::vector<char> chrVct = std::vector<char>(buf1.size(), *buf1.data());
msgpack::unpacked unPkd1;
msgpack::unpack(&unPkd1, buf1.data(), buf1.size());
msgpack::object toStr1 = unPkd1.get();
std::cout << "MsgPack1: " << toStr1 << std::endl;
msgpack::sbuffer buf2;
msgpack::packer<msgpack::sbuffer> bufPkr2(&buf2);
bufPkr1.pack_raw(chrVct.size());
bufPkr1.pack_raw_body(chrVct.data(), chrVct.size());
msgpack::unpacked unPkd2;
msgpack::unpack(&unPkd2, buf2.data(), buf2.size());
msgpack::object toStr2 = unPkd2.get();
std::cout << "MsgPack2: " << toStr2 << std::endl;
输出...
MsgPack1: [["foo", "bar", 221], ["foo", "bar", 221], ["foo", "bar", 221],..., ["foo", "bar", 221]]
MsgPack2: ""
一般来说,我只是无法弄清楚如何使用 MsgPack 对象,并且发现文档/示例有点稀疏。人们可以提供的任何帮助将不胜感激!
【问题讨论】: