Что делает msgpack object_with_zone?

При написании собственного сериализатора для msgpack_c нужно также реализовать object_with_zone,

Документация о том, как это реализовать, очень скудна ( https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor).

При каких обстоятельствах этот метод называется?

1 ответ

Решение

Вы можете создать msgpack::object из типов C++. См. https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_object

Когда вы звоните msgpack::object конструктор с зоной как msgpack::object(mc, z);, object_with_zone<T>::operator() называется внутренне.

Если вы не хотите создавать msgpack::object из типов C++ вам не нужно определять object_with_zone специализация. Упаковка, распаковка и преобразование в типы C++ из msgpack::object не требуй этого

Вот пример:

#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

обновленный

Дополнительный вопрос Почему я хочу использовать зону?

Ответ:

Зона используется внутренне, когда вы распаковываете форматированный байтовый поток MessagePack. Ты получаешь msgpack::object_handle, msgpack::object_handle имеет зону и msgpack::object, См. https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_object.

Причина использования msgpack::zone для исполнения. Если msgpack::object является STR, BIN, или же EXT, msgpack::object нужно выделять память динамически. msgpack::object может иметь ручку памяти самостоятельно, но это неэффективно. Деструктор msgpack::object нужно освободить память, если msgpack::object выделить память. msgpack::object это составная структура данных. Это означает, что деструктор не может быть встроен.

Одна из целей msgpack-c - эффективная распаковка. Так что msgpack-c использует msgpack::zone,

Это распаковка истории. msgpack::zone также используется, когда msgpack::object создается из типов C++. Я не уверен, когда пользователи хотят сделать, это зависит от пользователей.

Другие вопросы по тегам