c++ - msgpack 的 object_with_zone 有什么作用?

标签 c++ msgpack

msgpack_c 编写自定义序列化程序时,还需要实现 object_with_zone

关于如何实现它的文档非常稀少 ( https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor )。

这个方法在什么情况下被调用?

最佳答案

您可以创建一个 msgpack::object来自 C++ 类型。 参见 https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_object#conversion

当您调用 msgpack::object 时带区域的构造函数 msgpack::object(mc, z); , object_with_zone<T>::operator()在内部调用。

如果你不想创建msgpack::object从 C++ 类型,你不需要定义 object_with_zone特化。从 msgpack::object 打包、解包和转换为 C++ 类型不需要它。

这是一个例子:

#include <iostream>
#include <msgpack.hpp>

class my_class {
public:
    my_class(std::string const& name, int age):name_(name), age_(age) {}

    std::string const& get_name() const { return name_; }
    int get_age() const { return age_; }

private:
    std::string name_;
    int age_;
};

// User defined class template specialization
namespace msgpack {
MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) {
namespace adaptor {

template <>
struct object_with_zone<my_class> {
    void operator()(msgpack::object::with_zone& o, my_class const& v) const {
        std::cout << "object_with_zone<my_class> is called" << std::endl;
        o.type = type::ARRAY;
        o.via.array.size = 2;
        o.via.array.ptr = static_cast<msgpack::object*>(
            o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size, MSGPACK_ZONE_ALIGNOF(msgpack::object)));
        o.via.array.ptr[0] = msgpack::object(v.get_name(), o.zone);
        o.via.array.ptr[1] = msgpack::object(v.get_age(), o.zone);
    }
};

} // namespace adaptor
} // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)
} // namespace msgpack

int main() {
    my_class mc("John", 42);
    msgpack::zone z;
    auto obj = msgpack::object(mc, z);
    std::cout << obj << std::endl;
}

输出:

object_with_zone<my_class> is called
["John", 42]

运行演示:https://wandbox.org/permlink/dNmZX1FpUL3w8D5m

已更新

附加问题。 Why would i want to use the zone ?

回答:

当您解压 MessagePack 格式的字节流时,内部会使用一个区域。你得到 msgpack::object_handle . msgpack::object_handle有一个区域和一个 msgpack::object .参见 https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_object#what-is-msgpackobject .

使用msgpack::zone的原因是为了表现。如果msgpack::objectSTR , BIN , 或 EXT , msgpack::object需要动态分配内存。 msgpack::object可以自己处理内存,但效率低下。 msgpack::object 的析构函数需要释放内存,如果 msgpack::object分配内存。 msgpack::object是复合数据结构。这意味着不能内联析构函数。

msgpack-c 的目标之一是高效解包。所以 msgpack-c 使用 msgpack::zone .

这是开箱的故事。 msgpack::zone也用于 msgpack::object是从 C++ 类型创建的。我不确定用户什么时候想做,这取决于用户。

关于c++ - msgpack 的 object_with_zone 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45365999/

相关文章:

c++ - 在调用基类构造函数时声明默认构造函数

c# - 如何解码编码为 UTF8 的代理字符?

python - 如何在 Python 和 R 之间交换 Msgpack 文件?

c# - 将 MsgPack 与 Servicestack : how do I do KnownType? 一起使用

c++ - 如何使用opencv在视频中放置对象

c++ - boost STL vector 中的循环缓冲区在发布时崩溃

c++ - header 未刷新 - Visual C++ 2012

python - 无法从消息包(Ruby openssl)解码 python 中的加密字符串

java - 使用 MessagePack 的 Apache Beam - 如何从 Map<Value, Value> 获取值?

redis - 如何在redis-cli中查看解码后的消息包数据