boost::serialization中为泛型结构体(类)标注版本号
来源:互联网 发布:星际争霸 知乎 编辑:程序博客网 时间:2024/05/01 21:34
我使用boost::serialization主要是用在软件的工程管理中,在工程管理中版本兼容是很重要的,比如要保证一个比较旧的工程在最新版的软件里仍然可以被导入。
boost中可以使用BOOST_CLASS_VERSION这个宏为某个结构体(类)标记版本号(版本号最大是256)。但在使用时发现这个宏有一个局限,就是不能为泛型结构体(类)标记。比如有以下支持序列化的结构体:
template< typename T >struct PointEx{float X;float Y;T flag;template< typename Archive >void serialize( Archive &ar, const unsigned int version ){ar & BOOST_SERIALIZATION_NVP( X );ar & BOOST_SERIALIZATION_NVP( Y );ar & serialization::make_nvp( "flag", flag );}};BOOST_CLASS_VERSION( PointEx, 13 );这样会产生一个编译错误:
于是查看BOOST_CLASS_VERSION的详细定义(在boost/serialization/version.hpp中):
#define BOOST_CLASS_VERSION(T, N) \namespace boost { \namespace serialization { \template<> \struct version<T > \{ \
// 中间省略 \} \发现它根据类名定义了一个泛型结构体version<T>,在version内部记录了版本号N的相关内容。整个宏中与我们定义的类PointEx相关的就version<T >这一句,那么如果T是泛型的,这样的定义当然编译不通了,于是凭直觉我尝试做出如下新的宏定义:
#define BOOST_CLASS_VERSION_GENERIC( T, N ) \namespace boost { \namespace serialization { \template< typename U > \struct version< T< U > > \{ \ typedef mpl::int_< N > type; \ typedef mpl::integral_c_tag tag; \ BOOST_STATIC_CONSTANT( int, value = version::type::value ); \ BOOST_MPL_ASSERT( ( boost::mpl::less< boost::mpl::int_< N >, \boost::mpl::int_< 256 > > ) ); \}; \} } \应用到PointEx后果然可以!类似的我们还可以定义更多的诸如template< typename U1,typename U2 > struct version< T< U1, U2 > >这样的宏方便其他泛型使用。
完整的测试代码:
#include <stdio.h>#include <fstream>#include <boost/archive/xml_oarchive.hpp>#include <boost/archive/xml_iarchive.hpp>#include <boost/serialization/nvp.hpp>#include <boost/serialization/version.hpp>using namespace std;using namespace boost;#define BOOST_CLASS_VERSION_GENERIC( T, N ) \namespace boost { \namespace serialization { \template< typename U > \struct version< T< U > > \{ \ typedef mpl::int_< N > type; \ typedef mpl::integral_c_tag tag; \ BOOST_STATIC_CONSTANT( int, value = version::type::value ); \ BOOST_MPL_ASSERT( ( boost::mpl::less< boost::mpl::int_< N >, \boost::mpl::int_< 256 > > ) ); \}; \} } \template< typename T >struct PointEx{float X;float Y;T flag;template< typename Archive >void serialize( Archive &ar, const unsigned int version ){cout << version << endl;ar & BOOST_SERIALIZATION_NVP( X );ar & BOOST_SERIALIZATION_NVP( Y );ar & serialization::make_nvp( "flag", flag );}};BOOST_CLASS_VERSION_GENERIC( PointEx, 13 );int main(int argc, char* argv[]){PointEx< int > _Pnt = { 3.3f, 5.4f, 123 };cout << "Serialize version : ";ofstream ofile( "proj.dat" );archive::xml_oarchive oa( ofile );oa << serialization::make_nvp( "Point", _Pnt );ofile.close();cout << "Deserialize version : ";ifstream ifile( "proj.dat" );archive::xml_iarchive ia( ifile );PointEx< int > _PntD;ia >> serialization::make_nvp( "Point", _PntD );ifile.close();return 0;}
0 0
- boost::serialization中为泛型结构体(类)标注版本号
- boost中serialization模块的单体类
- boost::serialization(1)基础
- boost::serialization
- boost serialization
- boost::serialization
- boost serialization
- boost::serialization
- Boost serialization
- boost中serialization库对unordered_map支持
- C++中使用boost::serialization库――应用篇
- C++中使用boost::serialization库――应用篇
- boost::serialization 用基类指针转存派生类(错误多多,一波三折)
- Learning boost 1 Serialization
- Learning boost 1 Serialization
- Learning boost Serialization
- boost::serialization学习笔记
- Boost::Serialization试用手记
- linux glassfish 安装配置
- ubuntu安装emacs
- http 发送xml到服务器,服务器处理之后返回结果
- 少于五分钟的学习SQLite数据库设计
- Java条件表达式结果类型的规则
- boost::serialization中为泛型结构体(类)标注版本号
- <requestFocus />
- 遍历Map的方式
- Extjs 整体架构 和 组件的引用 和 控件的整合
- 使用Data Template作为BIP报表的数据源
- Sun Exadata X2-2 Rman L1 backup Ora-00600 krbbsThrottle_ zero_total_size
- 第1次实验——NPC问题(回溯算法、聚类分析)
- apache 加载不同php版本
- html5中的datalist