【发布时间】:2017-06-23 15:39:34
【问题描述】:
我想像这样使用 MessagePack 在 C++ 和 Python 语言之间共享结构化数据:
{
"t" : [ [t00,...,t0N], ... , [tM0,...,tMN] ],
"x" : [ x0,..,xN],
"P" : [ [P00, ..., P0N], ..., [PM0,...,PMN] ]
}
变量的数量是可选的,因此在某些情况下,我将仅作为示例:
{
"t" : [ [t00,...,t0N], ... , [tM0,...,tMN] ]
}
用 Python 解码很简单,我的问题是弄清楚 如果我事先不知道的结构,如何在 C++ 中对此进行解码 数据 ?或我将拥有的变量的确切数量;是吗 在这些情况下可以迭代结构吗?
我设法处理了一个“固定”的数据结构(总是使用相同的 变量的数量)定义一个结构,例如:
struct variables
{
std::vector< std::vector<double> > t;
std::vector< double > x;
std::vector< std::vector<double> > P;
MSPACK_DEFINE_MAP( t, x, P );
};
std::stringstream inBuffer;
.... (read data )
std::string str( inBuffer.str() );
msgpack::object_handle oh = msgpack::unpack( str.data(), str.size() );
msgpack::object deserialized = oh.get();
variables var;
deserialized.convert( var );
有没有更好的方法来完成这个?,如何管理可选 不能出现在结构中的变量?我重复 上一个问题:我可以在 C++ 中迭代一个未知的数据结构吗? 怎么样?
提前致谢!
问候,埃内斯托
【问题讨论】:
-
我没有使用过消息包,但您需要实际遍历每个级别的数据,并且知道或能够查询每个级别预期/存在的数据类型水平。
-
嗨,xaxxon,感谢您的回复,但我完全不知道是否可以迭代或“导航”消息包中的数据,也许我必须编辑我的问题。
-
你使用的是哪个 C++ msgpack 实现?
-
看起来你通过调用 unpack 得到了你的顶级 msgpack::object,然后你可以使用 ::as
() 操作符尝试将其转换为特定类型,例如作为地图。然后从那里,您可以查看映射的键/值对并检索与每个键关联的 msgpack::object - 您可以在这些对象上调用 as () 等等。您可以使用的不同类型尝试转换为:c.msgpack.org/cpp/annotated.html object_map、object_array 等。我从未这样做过,但查看 API 并使用过类似的 API,这似乎是正确的。