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>