【问题标题】:what does msgpack's object_with_zone do?msgpack 的 object_with_zone 有什么作用?
【发布时间】:2017-07-28 06:06:06
【问题描述】:

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

如何实现这一点的文档非常少(https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor)。

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

【问题讨论】:

    标签: c++ msgpack


    【解决方案1】:

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

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

    如果您不想从 C++ 类型创建 msgpack::object,则无需定义 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_handlemsgpack::object_handle 有一个区域和一个 msgpack::object。见https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_object#what-is-msgpackobject

    使用msgpack::zone 的原因是为了性能。如果msgpack::objectSTRBINEXT,则msgpack::object需要动态分配内存。 msgpack::object 可以自己拥有内存句柄,但效率低下。 msgpack::object 的析构函数需要释放内存,如果msgpack::object 分配内存。 msgpack::object 是一种复合数据结构。这意味着析构函数不能被内联。

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

    这是一个拆包的故事。当 msgpack::object 是从 C++ 类型创建时,也会使用 msgpack::zone。我不确定用户什么时候想做什么,这取决于用户。

    【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2011-07-17
    • 2014-09-13
    相关资源
    最近更新 更多