msgpack:解压缩自定义类,不知道类型

问题描述 投票:0回答:1

这是我的代码段,用于打包和解压缩已知的类:

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?

谢谢!

c++ msgpack
1个回答
0
投票

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;
    }
};

通过检查对象的类型并验证其大小正确,在此处进行验证。对于对象,您必须:

  • 确认它是一个对象
  • 验证其具有正确的成员名称
  • 确认每个成员名称是正确的类型
© www.soinside.com 2019 - 2024. All rights reserved.