Boost中支持序列化反序列化的库--boost.serialization

来源:互联网 发布:网络管理安全防御措施 编辑:程序博客网 时间:2024/05/22 08:05
boost.serialization的特点1.         支持XML和二进制两种形式2.         支持类的版本号3.         支持深度指针存储4.         支持多个指针共享数据5.         支持STL容器存储6.         支持原生数组存储7.         支持非侵入性的设计,序列化的类不需要继承特殊的类,不需要写特殊的方法(原来的类中要存储的属性必须共有) 我遇到的问题1.         如果要存储STL容器,要引入头文件 #include <boost/serialization/vector.hpp>。2.         如果之前引入了<windows.h>,编译会出错,原因是windows.h中定义了min,max宏,我们可以在#include<windows.h>之前把min,max禁止,使用#define NOMINMAX。或者使用#undef min和#undef max  我存在的疑问XML中属性的意义尚不明确,手工添加数据可能有危险XML中的类型用数字来表示,不知道读取原理,如果代码添加了新的类会不会对原有数据有影响 参考详细说明见:$/boost_1_37_0/libs/serialization/doc/index.html后面附了一个示例和一个生成的XML附录A/////////////////////////////////////////////////file : .h #pragma once#include <vector>#include <boost/serialization/base_object.hpp>#include <boost/archive/text_oarchive.hpp>#include <boost/archive/text_iarchive.hpp>#include <boost/serialization/vector.hpp> using namespace std; class DBConfigItem{public:       DBConfigItem(const String& dsn,const String & usrName,const String & password,size_t connectCnt);       DBConfigItem(const DBConfigItem & item);       DBConfigItem();       ~DBConfigItem(); private:       friend class boost::serialization::access;       template<class Archive>              void serialize(Archive & ar, const unsigned int version)       {              ar & BOOST_SERIALIZATION_NVP(dataSourceName);              ar & BOOST_SERIALIZATION_NVP(usrName);              ar & BOOST_SERIALIZATION_NVP(usrPassword);              ar & BOOST_SERIALIZATION_NVP(connectCount);       }private:       String dataSourceName;       String usrName;       String usrPassword;       size_t connectCount;}; //===================================================================== class DBConfig{public:       DBConfig();       ~DBConfig();        void create();       void destroy();        void readFromXml(const String & pathName);       void saveToXml(const String & pathName); private:       friend class boost::serialization::access;       template<class Archive>              void serialize(Archive & ar, const unsigned int version)       {              ar & BOOST_SERIALIZATION_NVP(cfgItemList);       }private:       typedef std::vector<DBConfigItem*>::iterator iterator;       vector< DBConfigItem * > cfgItemList;}; /////////////////////////////////////////////////////////file : cpp      #include <iomanip>#include <iostream>#include <fstream>#include <boost/archive/tmpdir.hpp>#include <boost/archive/xml_iarchive.hpp>#include <boost/archive/xml_oarchive.hpp> void DBConfig::readFromXml(const String & pathName){       // open the archive       std::ifstream ifs(pathName.c_str());       assert(ifs.good());       boost::archive::xml_iarchive ia(ifs);       // restore the schedule from the archive       //ia >> BOOST_SERIALIZATION_NVP(*this);       ia >> boost::serialization::make_nvp(BOOST_PP_STRINGIZE(config1), *this);} void DBConfig::saveToXml(const String & pathName){       // make an archive       std::ofstream ofs(pathName.c_str());       assert(ofs.good());       boost::archive::xml_oarchive oa(ofs);       oa << boost::serialization::make_nvp(BOOST_PP_STRINGIZE(config1), *this);}附录B一个序列化后的XML文件  <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>  <!DOCTYPE boost_serialization (View Source for full doctype...)>- <boost_serialization signature="serialization::archive" version="5">-     <config1 class_id="0" tracking_level="0" version="0">-          <cfgItemList class_id="1" tracking_level="0" version="0">                 <count>3</count>                 <item_version>0</item_version>-                <item class_id="2" tracking_level="1" version="0" object_id="_0">                      <dataSourceName>scott</dataSourceName>                      <usrName>root</usrName>                      <usrPassword>admin</usrPassword>                      <connectCount>3</connectCount>              </item>-                <item class_id_reference="2" object_id="_1">                      <dataSourceName>scott</dataSourceName>                      <usrName>root</usrName>                       <usrPassword>admin</usrPassword>                       <connectCount>3</connectCount></item>                 <item class_id_reference="2" object_id_reference="_1" />        </cfgItemList></config1></boost_serialization>

原创粉丝点击