拆分save、load
class my_class
{
friend class boost::serialization::access;
// 或者用 BOOST_SERIALIZATION_SPLIT_MEMBER()
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
boost::serialization::split_member(ar, *this, version);
}
template<class Archive>
void save(Archive & ar, const unsigned int version) const
{
}
template<class Archive>
void load(Archive & ar, const unsigned int version)
{
}
};
判断当前是否loading、saving
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
if (Archive::is_loading())
{
}
if (Archive::is_saving())
{
}
}
保存二进制数据段
// 需要对应的头文件
#include <boost/serialization/binary_object.hpp>
// 序列化函数体内
ar & boost::serialization::make_nvp("named_binary_object", boost::serialization::binary_object(address, size));
Polymorphic Archives
用以将基于template的序列化函数实体写到cpp中,而不是.h中
// 在.cpp中间中包含对应的头文件
#include <boost/archive/polymorphic_iarchive.hpp>
#include <boost/archive/polymorphic_oarchive.hpp>
// 并实现特例化save、load模板函数
template<>
void my_class::save<boost::archive::polymorphic_oarchive>(boost::archive::polymorphic_oarchive & ar, const unsigned int version) const
{
}
template<>
void my_class::load<boost::archive::polymorphic_iarchive>(boost::archive::polymorphic_iarchive & ar, const unsigned int version)
{
}
在cpp中导出类
确保被导出的类具有(或者继承了)虚析构函数
// 在.cpp中包含对应的头文件
#include <boost/archive/polymorphic_iarchive.hpp>
#include <boost/archive/polymorphic_oarchive.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/export.hpp>
BOOST_CLASS_EXPORT(my_class)
子类继承而不调用父类序列化
class drived_class : public base_class
{
template <class Archive>
void serialize(Archive & ar, const unsigned int version)
{
boost::serialization::void_cast_register<drived_class, base_class>();
...
}
}
非植入式定义
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
class gps_position
{
public:
int degrees;
int minutes;
float seconds;
gps_position(){};
gps_position(int d, int m, float s) :
degrees(d), minutes(m), seconds(s)
{}
};
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, gps_position & g, const unsigned int version)
{
ar & g.degrees;
ar & g.minutes;
ar & g.seconds;
}
} // namespace serialization
} // namespace boost
stl兼容容器序列化
// 假设有容器对象
boost::circular_buffer<int> MyClass::m_buff;
template<class Archive>
void MyClass::save(Archive & ar, const unsigned int version) const
{
boost::serialization::stl::save_collection<Archive, boost::circular_buffer<int> >(ar, m_buff);
}
template<class Archive>
void MyClass::load(Archive & ar, const unsigned int version)
{
boost::serialization::item_version_type item_version(0);
boost::serialization::collection_size_type count;
ar >> BOOST_SERIALIZATION_NVP(count);
ar >> BOOST_SERIALIZATION_NVP(item_version);
m_buff.resize(count);
boost::serialization::stl::collection_load_impl<Archive, boost::circular_buffer<int> >(ar, m_buff, count, item_version);
}