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

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>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:要想使用网络框架的API来传输结构化的数据,必须得先实现结构化的数据与字节流之间的双向转换。这种将结构化数据转换成字节流的过程,称为序列化,反过来转换,就是反序列化。简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它依据流重构对象。\[2\]在C++,可以使用一些或框架来实现序列化反序列化。比如,可以使用BoostSerialization模块来实现对象的序列化反序列化Boost.Serialization提供了一种简单的方式来将C++对象序列化为字节流,并将字节流反序列化为原始对象。此外,C++标准也提供了一些序列化反序列化的功能,比如使用iostream的<<和>>运算符重载来实现对象的序列化反序列化。另外,还可以使用Google的Protocol Buffers来实现C++对象的序列化反序列化。这个提供了一种语言无关、平台无关、可扩展的序列化机制,可以将结构化数据序列化为二进制格式,以便在不同的系统之间进行数据交换。总之,C++有多种方法可以实现对象的序列化反序列化,具体选择哪种方法取决于具体的需求和使用场景。 #### 引用[.reference_title] - *1* *2* [C++ 序列化反序列化](https://blog.csdn.net/JMW1407/article/details/107173775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [c++序列化以及反序列化实现](https://blog.csdn.net/qq_33521184/article/details/125228533)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值