msgpack::object

什么是 msgpack::object

msgpack::object 是一种变体类型。 msgpack::object 的内部类型对应于 msgpack 格式。这是类型列表。

MessagePack type msgpack-c type
nil msgpack::type::NIL
boolean msgpack::type::BOOLEAN
uint msgpack::type::POSITIVE_INTEGER
int msgpack::type::NEGATIVE_INTEGER
float 32 msgpack::type::FLOAT32
float 64 msgpack::type::FLOAT64
str msgpack::type::STR
bin msgpack::type::BIN
ext msgpack::type::EXT
array msgpack::type::ARRAY
map msgpack::type::MAP

您可以通过类型成员变量获取 msgpack::object 的类型。

如果 msgpack::object 的类型是数组(array)或映射(map),则该对象有子对象。所以 msgpack::object 是一个复合结构。

object1

当 msgpack::object 的类型是 str、bin 或 ext 时,msgpack::object 可能有外部内存的引用。

object2

当你使用 msgpack::unpacker 时,msgpack::object_handle 管理所有分配的内存。将 msgpack::object_handle 视为智能指针。

当你使用没有 unpack_referenc_func 的 msgpack::unpack() 函数时,msgpack::object_handle 管理所有分配的内存。如果您提供一个返回 true 的自定义 unpack_referenc_func,您需要在未打包的 msgpack::object_handle 存在时保持传递给 msgpack::unpack() 的数据的生命周期。

Conversion(转换)

Conversion

当你解压 msgpack 格式的数据时,你会从 msgpack::object_handle 获得 msgpack::object。然后你从 msgpack::object 获取各种类型的值。如果要从 msgpack::object 转换为自定义类型,请参阅适配器

您可以使用以下构造函数从各种类型的值创建 msgpack::object。如果要从自定义类型创建 msgpack::object,请参阅 https://github.com/redboltz/msgpack-c/wiki/v2_0_cpp_adaptor#objecthttps://github.com/redboltz/msgpack-c/wiki/v2_0_cpp_adaptor#object_with_zone

    template <typename T>
    object(const T& v, zone& z);

你需要通过一个zone。当对象包含数组和/或映射时,子对象被分配在zone中。具有对应于 str 和 bin 的类型的值,该值的内容被复制到zone中,但有一个例外。例外是 msgpack::type::raw_ref。当您使用 raw_ref 调用 msgpack::object 构造函数时,如下所示:

msgpack::object obj(msgpack::type::raw_ref(data, size), zone);

数据不会被复制到zone。

Q.E.D.