Конкретный пример boost::serialization::traits?

Рассмотрим структуру для сериализации:

struct MyStruct {
   int a;
   std::string b;

template<class Archive>
void serialize(Archive &ar, const unsigned int)
   {
   ar & a & b;
   }
};

Я хочу явно пометить его, используя boost::serialization::traits, как track_never, так и object_serializable. Я изучил черты docs, но не могу понять, как его применять, и нигде не могу найти пример. Так...

а) Какой код применяет черты к этому конкретному классу?

б) Что такое BOOST_STATIC_ASSERT(), который проверяет, что каждый из них на месте?

c) Я предполагаю, что не могу сделать этот класс примитивным_типом, так как в типичном архивном классе нет функции-члена или шаблона, который может напрямую обрабатывать этот тип. Правильный?

Меня не волнует межплатформенная совместимость или совместимость архивов между версиями, просто быстрое чтение (и запись) и вмешательство в MyStruct - это нормально, но было бы неплохо увидеть, как это делается в обоих направлениях, если это возможно.


person JimB    schedule 22.02.2012    source источник


Ответы (1)


Поскольку MyStruct не является шаблонной структурой или классом, для применения трейтов все, что вам нужно сделать, это использовать BOOST_CLASS_IMPLEMENTATION и BOOST_CLASS_TRACKING макросы:

Вне определения вашего класса вам нужно будет написать следующие две строки:

BOOST_CLASS_IMPLEMENTATION(MyStruct, boost::serialization::object_serializable);
BOOST_CLASS_TRACKING(MyStruct, boost::serialization::track_never);

BOOST_STATIC_ASSERT() для проверки правильности ваших действий выглядит так:

BOOST_STATIC_ASSERT(boost::serialization::implementation_level<MyStruct>::value 
                    == boost::serialization::object_serializable);
BOOST_STATIC_ASSERT(boost::serialization::tracking_level<MyStruct>::value 
                    == boost::serialization::track_never);

Я бы сказал, что нет смысла делать это примитивным типом, потому что это не примитивный тип.

person alanxz    schedule 22.02.2012
comment
Как оказалось, два приведенных выше макроса должны быть именно в том порядке, в котором вы их разместили. Я их поменял местами, и поэтому у меня это не сработало. Точка с запятой в конце не обязательна, но не вредит. (Кстати, это все MinGW-32/gcc-4.4.) - person JimB; 23.02.2012