- 浏览: 258585 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (263)
- mysql (5)
- boost (6)
- 工具 (10)
- IT生活 (7)
- 多线程 (3)
- Ruby (15)
- php (2)
- MongoDB (39)
- 移动互联网 (2)
- 测试 (8)
- c++ (28)
- 书 (1)
- 网站 (3)
- 网络编程 (14)
- 开源软件 (1)
- 分布式计算 (1)
- 得得得 (1)
- php,wordpress (1)
- error (5)
- 编译 (2)
- 学习 (1)
- 杀毒软件 (1)
- dd (0)
- linux (21)
- 数据库 (1)
- STL (1)
- c++/c (5)
- 软件设计 (1)
- 操作系统 (4)
- 库 (2)
- win32 (1)
- s (0)
- openssl (1)
- perl (2)
- debug (1)
- windows (4)
- python (12)
- windows 防火墙 (1)
- vs (1)
- vim (2)
- vc (1)
- 浏览器插件的危害 (1)
- curl (0)
- 判断手机号码合法性的库 (0)
- 地址备注 (0)
- 安装 File::Slurp (1)
- cenos (2)
- shell (1)
- linunx (1)
- internet (1)
- software (1)
- widows (1)
- linux io (1)
- nginx (2)
- 算法 (2)
- google (1)
- protobuf (2)
- tengine (1)
- tools (1)
- lua (2)
- liunx (1)
- vcard (1)
- lua-iconv (1)
- 网络 (2)
- teat (0)
- ldconfig linux (0)
- awk (0)
- grep (0)
- windws (2)
- linux 命令 (1)
- tcp dump (1)
- vmware (1)
- question2answer (2)
- mongdb (1)
- 正则 (1)
- OCR (2)
- Windows Server (1)
最新评论
转: http://hi.baidu.com/ewook/blog/item/add93b6da0d5e2e1431694e5.html
序列化是将对象状态信息转换为可存储或传输的过程,序列化时,对象会将当前状态写入到临时或持久性的存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
对象序列化反序列化通常用于:
1. 将对象存储于硬盘上
2. 在网络上传送对象的字节序列
更多介绍
常见的C++序列化方案
==Boost.Serialization==
介绍:Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:
1. 代码可移植(实现仅依赖于ANSI C++)
2. 深度指针保存与恢复
3. 可以序列化STL容器和其他常用模版库
4. 数据可移植
5. 非入侵性
使用:教程http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html
下载Boost库,并根据需要编译(Boost库涉及较广)。
编写应用。
●依需求编写入侵式或非入侵式序列化方法
●支持STL容器类、指针、父子类的序列化
为需要序列化的类添加序列化代码。
●初始化fstream
●需求初始化xml, text, binary存档
●写入对象,并关闭文件流
== MFC Serialization ==
简介:Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。因此,所有从 CObject 派生的类都可利用 CObject 的序列化协议。(MSDN中的介绍)
使用:
为VS项目添加MFC支持
●设置项目属性
●包含头文件C++:
1 #include <afxwin.h>
2 #include <afxtempl.h>
●编写继承CObject的类
●实现序列化方法C++:
1 void Serialize(CArchive& ar);
●添加序列化宏C++:
1 //添加在声明类中
2 DECLARE_SERIAL(basic_pojo_mfc)
3 //…
4 //添加在实现文件中
5 IMPLEMENT_SERIAL(MyObject, CObject, 1)
●编写序列化与反序列化的对象
●创建CFile,CArchive对象
●写入对象,关闭资源
==Google Protocol Buffers==
简介:Google Protocol Buffers (GPB)是Google内部是用的数据编码方式,旨在用来代替XML进行数据交换。可用于数据序列化与反序列化。主要特性有:
1. 高效
2. 语言中立(Cpp, Java, Python)
3. 可扩展
官方文档
使用:
●下载GPB,并编译出需要使用的库。
●编写.proto文件,并编译出.cc与.h文件。
●依规则编写.proto
●编译
●Shell/CMD:
1 protoc -I=$SRC_DIR –cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
●编写序列化与反序列化代码。
比较
==测试用例介绍==
比较维度:
●序列化与反序列化消耗的时间
●产生数据文件大小
测试数据类型:
测试代码
结果
序列化与反序列化消耗的时间:
产生数据文件大小:
数据:
结论
Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。Boost.Serialization 使用灵活简单,而且支持标准C++容器。相比而言,MFC的效率较低,但是结合MSVS平台使用最为方便。希望有时间补充更多的序列化方案及测试指标。
序列化是将对象状态信息转换为可存储或传输的过程,序列化时,对象会将当前状态写入到临时或持久性的存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
对象序列化反序列化通常用于:
1. 将对象存储于硬盘上
2. 在网络上传送对象的字节序列
更多介绍
常见的C++序列化方案
==Boost.Serialization==
介绍:Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:
1. 代码可移植(实现仅依赖于ANSI C++)
2. 深度指针保存与恢复
3. 可以序列化STL容器和其他常用模版库
4. 数据可移植
5. 非入侵性
使用:教程http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/tutorial.html
下载Boost库,并根据需要编译(Boost库涉及较广)。
编写应用。
●依需求编写入侵式或非入侵式序列化方法
●支持STL容器类、指针、父子类的序列化
为需要序列化的类添加序列化代码。
●初始化fstream
●需求初始化xml, text, binary存档
●写入对象,并关闭文件流
== MFC Serialization ==
简介:Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。因此,所有从 CObject 派生的类都可利用 CObject 的序列化协议。(MSDN中的介绍)
使用:
为VS项目添加MFC支持
●设置项目属性
●包含头文件C++:
1 #include <afxwin.h>
2 #include <afxtempl.h>
●编写继承CObject的类
●实现序列化方法C++:
1 void Serialize(CArchive& ar);
●添加序列化宏C++:
1 //添加在声明类中
2 DECLARE_SERIAL(basic_pojo_mfc)
3 //…
4 //添加在实现文件中
5 IMPLEMENT_SERIAL(MyObject, CObject, 1)
●编写序列化与反序列化的对象
●创建CFile,CArchive对象
●写入对象,关闭资源
==Google Protocol Buffers==
简介:Google Protocol Buffers (GPB)是Google内部是用的数据编码方式,旨在用来代替XML进行数据交换。可用于数据序列化与反序列化。主要特性有:
1. 高效
2. 语言中立(Cpp, Java, Python)
3. 可扩展
官方文档
使用:
●下载GPB,并编译出需要使用的库。
●编写.proto文件,并编译出.cc与.h文件。
●依规则编写.proto
●编译
●Shell/CMD:
1 protoc -I=$SRC_DIR –cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
●编写序列化与反序列化代码。
比较
==测试用例介绍==
比较维度:
●序列化与反序列化消耗的时间
●产生数据文件大小
测试数据类型:
C++:01 //基本数据类型 02 class basic_pojo { 03 public : 04 char char8; 05 unsigned char uchar8; 06 short short16; 07 unsigned short ushort16; 08 int int32; 09 unsigned int uint32; 10 long long32; 11 unsigned long ulong32; 12 float float32; 13 double double64; 14 bool bool8; 15 }; 16 17 //复合数据类型 18 class complex_pojo { 19 public : 20 string string_stl; 21 basic_pojo_boost basic_class; 22 };
测试代码
结果
序列化与反序列化消耗的时间:
产生数据文件大小:
数据:
Protocol Buffers | Boost.Serialization | MFC:Serialization | |
Serialization(ms) | 94 | 219 | 1218 |
Unserialization(ms) | 203 | 296 | 1282 |
Archive Size(KB) | 4590 | 4493 | 5372 |
结论
Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。Boost.Serialization 使用灵活简单,而且支持标准C++容器。相比而言,MFC的效率较低,但是结合MSVS平台使用最为方便。希望有时间补充更多的序列化方案及测试指标。
发表评论
-
c++ 读取unicode文档
2015-02-09 16:12 915int ReadOneNameFile(char *fil ... -
http://curl.haxx.se/
2013-06-13 17:41 0http://curl.haxx.se/ -
[转]线程本地存储(Thread Local Storage, TLS)分析与使用
2013-05-03 16:53 769线程本地存储(Thread Local Storage, TL ... -
C/C++获得windows版本
2012-12-01 11:05 1397MSDN上有详细介绍,做个标记: #include & ... -
[转]异常处理与MiniDump详解(4) MiniDump
2012-10-24 14:46 927异常处理与MiniDump详解(4) MiniDump wri ... -
禁用系统硬错误消息对话框
2012-08-31 19:14 688http://support.microsoft.com/kb ... -
Application Crash Dump Analysis (Windows 7)
2012-08-28 09:39 0Application Crash Dump Analysis ... -
如何成为一个windows程序debug高手
2012-08-18 14:40 0minidump: http://blog.csdn.ne ... -
Boost库编译后命名方式
2012-05-17 10:29 1280Boost官网的《Geting Started ... -
geoIP
2012-05-14 12:38 0http://www.oschina.net/code/sni ... -
vs2010 断点 无法命中
2012-05-07 16:13 1313这种情况不解决办法有 很多。你这个方法我没用过。最简单的方法就 ... -
$err,hr
2012-05-04 20:43 846在Visual C++ 中,可以在监视窗口添加 $err,hr ... -
WINDOWS下线程同步探讨
2012-04-11 15:04 919概述 线程同步可 ... -
undefined reference to 'pthread_create'问题解决
2012-03-30 11:43 0由于是Linux新手,所以现在才开始接触线程编程,照着GUN/ ... -
linux 下 遍历文件夹下的内容
2012-03-29 19:43 0// only works in cpp #ifdef __c ... -
浅谈ReadDirectoryChangesW函数的作用和问题所在
2012-03-23 10:32 4243转自:http://www.cnblogs.com ... -
用 _findfirst 和 _findnext 查找文件,遍历文件夹
2012-03-30 11:39 1982标签: _findfirst _findnext 杂谈 分类: ... -
我的广告
2012-03-19 10:57 0http://www.webweb.com/signup.as ... -
服务器多服务器设置
2012-03-12 18:01 721当服务器功能比较多时,可以抽象出一个代理,将不同的服务 ... -
记录个函数 strstr
2012-03-10 11:30 985包含文件:string.h 函数名: strstr 函 ...
相关推荐
本文主要在.NET平台上对比Hprose与.NET平台中提供的各种序列化方式的比较,序列化并不是Hprose的全部,但它是Hprose的核心部分之一,通过对序列化的比较,我们就可以对Hprose的性能有一个大概的了解了。 Hprose提供...
《编写高质量代码:改善c#程序的157个建议》一共三个部分,第一部分专注于c#语言本身,一共89条建议,涵盖了c#语言基本要素、集合、linq、泛型、委托、事件、资源管理、序列化、异常处理、异步、多线程、任务和并行...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
12.2.8 通过序列化进行深层复制 12.2.9 使克隆具有更大的深度 12.2.10 为什么有这个奇怪的设计 12.3 克隆的控制 12.3.1 副本构建器 12.4 只读类 12.4.1 创建只读类 12.4.2 “一成不变”的弊端 12.4.3 不变字串 ...
在大部分系统语言中,比如 C 和 C++,您必须进行内存管理。本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上进行汇编语言编程的时代,那时内存管理还不是个大问题。您实际上在...
malloc 初始化代码,它将找到当前中断点并初始化我们的变量: 清单 2. 分配程序初始化函数 /* Include the sbrk function */ #include void malloc_init() { /* grab the last valid address from the OS *...