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

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

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

4

Решение

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/,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]