Что делает 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++. Я не уверен, когда пользователи хотят сделать, это зависит от пользователей.