Есть ли способ в MsgPack C ++ использовать MSGPACK_DEFINE без изменения членов класса? Мы бы хотели сохранить содержимое пакета сообщений вне заголовков и использовать его только внутри библиотеки.
Кажется, что просто обернуть каждый класс будет работать, но я надеюсь, что есть лучший способ.
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/
,
Других решений пока нет …