Использование MSGPACK_DEFINE без изменения объявлений классов

Есть ли способ в MsgPack C++ использовать MSGPACK_DEFINE без изменения членов класса? Мы хотели бы сохранить содержимое пакета сообщений вне заголовков и использовать его только внутри библиотеки.

Кажется, что просто обернуть каждый класс будет работать, но я надеюсь, что есть лучший способ.

1 ответ

UPD. В качестве альтернативы вы можете использовать MSGPACK_DEFINE_EXTERNAL макрос я написал.

.hpp.erb источник доступен здесь и сгенерирован .hpp здесь

Просто #include "define_external.hpp", а затем позвоните MSGPACK_DEFINE_EXTERNAL передавая класс и его членов, вы хотите быть сериализованным / десериализованным.

Например:

MSGPACK_DEFINE_EXTERNAL(v3f, X, Y, Z);

Я протестировал этот заголовочный файл для работы с gcc 4.8.2, clang 3.3 и MSVC 2010.


Чтобы добиться этого в моем проекте, я просто определил operator>> а также operator<<, Это не так просто, как просто MSGPACK_DEFINE, но это работает.

namespace msgpack {

inline v3f& operator>> (object o, v3f& v)
{
    if(o.type != type::ARRAY) { throw type_error(); }
    if(o.via.array.size != 3) { throw type_error(); }
    o.via.array.ptr[0].convert(&v.X);
    o.via.array.ptr[1].convert(&v.Y);
    o.via.array.ptr[2].convert(&v.Z);
    return v;
}

template <typename Stream>
inline packer<Stream>& operator<< (packer<Stream>& o, const v3f& v)
{
    o.pack_array(3);
    o.pack(v.X);
    o.pack(v.Y);
    o.pack(v.Z);
    return o;
}

}

Вы можете найти больше примеров в src/msgpack/type/,

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