2012-02-22 4 views
2

Рассмотрим структуру сериализовать:Конкретный пример boost :: serialization :: traits?

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

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

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

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

b) Что такое BOOST_STATIC_ASSERT(), который проверяет каждый на своем месте?

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

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

ответ

2

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

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

+1

Как оказалось, два вышеуказанных макроса должны быть в том порядке, в котором вы их разместили. Я их перевернул, и поэтому он не работал для меня. Полуколоны в конце не требуются, но не наносят никакого вреда. (Кстати, это все MinGW-32/gcc-4.4.) – JimB

Смежные вопросы