Конкретный пример повышения :: сериализации :: черты? - PullRequest
2 голосов
/ 22 февраля 2012

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

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. Я смотрел на черты документов , но, похоже, не могу сообразить, как его применить, и нигде не могу найти пример. Итак ...

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

б) Что за BOOST_STATIC_ASSERT() проверяет наличие каждого?

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

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

1 Ответ

2 голосов
/ 22 февраля 2012

Поскольку 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);

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

...