Boost中支持序列化反序列化的库--boost.serialization
2013-09-17 10:19
302 查看
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>
相关文章推荐
- Boost中支持序列化反序列化的库--boost.serialization
- 怎样用boost::serialization去序列化派生模板类
- Java Serialization/序列化/反序列化
- 轻量级序列化库boost serialization
- System.Runtime.Serialization 命名空间(序列化和反序列化)
- boost::serialization 多态(polymorphic)序列化技巧及分析
- 让NET CF 支持Binary Formatter 序列化(Support Binnary Formatter Serialization on NET Compact Framework)
- boost.serialization中基类指针容器存子类对象的序列化
- Spring RedisTemplate 序列化、反序列化扩展支持 FastJson:GenericFastJson2JsonRedisSerializer
- [置顶] boost如何序列化 和反序列化 指针类(本身类也可以)
- 最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)
- LIST<T>现在也支持序列化和反序列化了
- Java Serialization/序列化/反序列化 及 transient Java关键字详解
- 畅游C++ Boost Serialization 序列化
- Boost - 序列化 (Serialization)
- 如何用boost::serialization去序列化派生模板类(续)
- 探究序列化与反序列化能力(上) - 客户端支持,JavaScriptTypeResolver与JavaScriptConverter
- boost--序列化库serialization
- 轻量级序列化库boost serialization
- 支持vector,map,list<map>序列化,反序列化实现