这是我的代码段,用于打包和解压缩已知的类:
MessageCoffeeIsReady input(1, "Black coffee is ready");
// ---- Serialize to buffer
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, input);
// ---- Send over line...
// ---- Unpack received buffer
msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size());
msgpack::object obj = oh.get();
// ---- Convert to message
MessageCoffeIsReady result; // <- How do i know the msgpack::object contains `MessageCoffeIsReady`?
obj.convert(result);
我的班级看起来像这样:
class MessageCoffeeIsReady : public MessageBase
{
protected:
std::string m_name;
int m_id;
public:
MessageCoffeeIsReady(int id, std::string name)
{ m_id = id; m_name = name; }
MSGPACK_DEFINE (m_name, m_id);
};
我的问题是:我怎么知道我收到了MessageCoffeIsReady
类型的消息?有没有我可以用来转换为特定类的内部typeid?
谢谢!
msgpack不会自动执行所有操作,它依赖于您为用户定义的类型编写解码器:https://github.com/redboltz/msgpack-c/wiki/v2_0_cpp_object#conversion
查看该页面上的从对象转换为用户定义类型的示例:
// Place class template specialization here
template<>
struct convert<my_class> {
msgpack::object const& operator()(msgpack::object const& o, my_class& v) const {
if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
if (o.via.array.size != 2) throw msgpack::type_error();
v = my_class(
o.via.array.ptr[0].as<std::string>(),
o.via.array.ptr[1].as<int>());
return o;
}
};
通过检查对象的类型并验证其大小正确,在此处进行验证。对于对象,您必须: