boost::serialization学习笔记-----类成员序列化
来源:互联网 发布:宣传片制作软件 编辑:程序博客网 时间:2024/06/11 16:48
boost::serialization 基于 boost::archive 来完成任意复杂数据结构的序列化,boost::archive提供两个实现类来完成序列化、反序列化操作:
boost::archive::text_oarchive 序列化数据,也称为:输出、保存(save)
boost::archive::text_iarchive 反序列化数据,也称为:输入、载入(load)
&操作符
序列化操作使用 << 或者 & 操作符将数据存入text_oarchive中:
ar & data;
反序列化操作使用 >> 或者 & 操作符从text_iarchive中读取数据:
ar & data;
为什么要引入&操作符?很简单,&操作符可以同时用于序列化和反序列化操作,这样就只需要提供一个 serialize 模板函数就可以同时用于两种操作,具体执行哪种由ar的类型(模版参数类型)决定;如果ar是text_oarchive类型则是序列化,如果ar是text_iarchive类型则是反序列化。
serialize模版函数
基础简单数据类型直接使用&操作符就行了,class类型数据需要自定义serialize模板函数来序列化对象,序列化时serialize函数会被自动调用。
有两种方式来给class添加serialize接口,一种是成员函数方式(intrusive),另一种是非成员函数方式(non-intrusive)。这两种方式各有利弊:non-intrusive方式虽然不用修改class的定义,但要求class数据成员的访问属性为public,不过可以通过声明函数为friend来解决这个问题。
成员函数方式(intrusive)
2 * GPS坐标点
3 */
4 class gps_position
5 {
6 private:
7 friend class boost::serialization::access;
8
9 //intrusive方式,该成员函数同时用于序列化和反序列化操作
10 template<class Archive>
11 void serialize(Archive & ar, const unsigned int version)
12 {
13 ar & degrees & minutes & seconds;
14 }
15
16 int degrees;
17 int minutes;
18 float seconds;
19
20 public:
21 gps_position(){};
22 gps_position(int d, int m, float s) :
23 degrees(d), minutes(m), seconds(s)
24 {}
25 };
非成员函数方式(non-intrusive)
2 * GPS坐标点
3 */
4 class gps_position
5 {
6 //non-intrusive方式,定义友元模版函数
7 template<class Archive>
8 friend void serialize(Archive& ar, gps_position& g, const unsigned int version)
9 {
10 ar & g.degrees & g.minutes & g.seconds;
11 }
12
13
14 private:
15 int degrees;
16 int minutes;
17 float seconds;
18
19 public:
20 gps_position(){};
21 gps_position(int d, int m, float s) :
22 degrees(d), minutes(m), seconds(s)
23 {}
24 };
类成员序列化
对类进行序列化要求所涉及的数据成员必须是可序列化的,即为:简单数据类型(POD)、数组类型、STL容器、或者实现了serialize接口的用户类。一个复合类类型实现了serialize接口后,就只需要将该类看做一个整体传给&操作符进行序列化,&操作符在序列化其数据成员时会自动调用相应的serialize接口进行处理。
2 * bus_stop类
3 */
4 class bus_stop
5 {
6 friend class boost::serialization::access;
7
8 //只要数据成员类型是可序列化的就可以使用&操作符进行处理
9 //可序列化的类型包括:基础的简单数据类型、数组类型、STL容器、或者实现了serialize接口的类
10 template<class Archive>
11 void serialize(Archive & ar, const unsigned int version)
12 {
13 ar & latitude & longitude;
14 }
15
16 gps_position latitude; //serializable members
17 gps_position longitude;
18
19 protected:
20 bus_stop(const gps_position & lat_, const gps_position & long_) :
21 latitude(lat_), longitude(long_)
22 {}
23
24 public:
25 bus_stop(){}
26
27 virtual ~bus_stop(){}
28 };
- boost::serialization学习笔记-----类成员序列化
- Boost - 序列化 (Serialization)
- boost Serialization序列化
- Boost - 序列化 (Serialization)
- Boost - 序列化 (Serialization)
- Boost - 序列化 (Serialization)
- Boost - 序列化 (Serialization)
- Boost - 序列化 (Serialization)
- boost序列化(Serialization)
- boost::serialization学习笔记
- boost::serialization学习笔记
- 怎样用boost::serialization去序列化派生模板类
- 怎样用boost::serialization去序列化派生模板类(续)
- 轻量级序列化库boost serialization
- 对象序列化之Boost.Serialization
- 轻量级序列化库boost serialization
- 畅游C++ Boost Serialization 序列化
- Boost - 序列化 (Serialization) (写得很好**)
- Linux 关于动态链接库以及静态链接库的一些概念
- WinForm设置FormBorderStyle=none后仍可以使用任务栏左键和右键功能
- 高性能WEB服务器开发心得整理
- hdu 1022 Train Problem I
- 小明系列故事——师兄帮帮忙(hdu4506大数幂取模)
- boost::serialization学习笔记-----类成员序列化
- 窗体最大化时 全屏 不会遮盖任务
- 关于C语言数组越界的演示程序
- 怎么在像dos这样的黑窗口进行复制和粘贴
- 使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。
- Jquery实现隔行变色问题
- POJ 1947 树形dp
- .net 4.0 检测到有潜在危险的 Request.Form 值。
- 简单的gcd函数
可否给个例子?多谢!
E-MAIL:yxmmrwx@hotmail.com
class CA
{
...
};
class CB
{
...
};
class CC
:public CA
,public CB
{
...
};
你这个应该这样一下就好了吧
#pragma once
class CA
{
public:
int a;
template<class Archive>
void serialize(Archive& ar, const unsigned int /* file version */){
ar & a;
}
};
class CB
{
public:
int b;
template<class Archive>
void serialize(Archive& ar, const unsigned int /* file version */){
ar & b;
}
};
class CC
:public CA
,public CB
{
public:
int c;
template<class Archive>
void serialize(Archive& ar, const unsigned int /* file version */){
ar & boost::serialization::base_object<CA>(*this);
ar & boost::serialization::base_object<CB>(*this);
ar & c;
}
};