struct student
int id;
string name;
将一个student对象转换成字节数据存储在ByteArray[20]中称为序列化代码如
int count = 0;
char ByteArray[20];
student s;
s.id = 12;
s.name = "specialist";
memcpy(ByteArray,&s.id,sizeof(s.id));
count += sizeof(s.id);
memcpy(ByteArray+count,s.name.c_str(),s.name.length());
count += s.name.length();
把字节数据还原成student对象称为反序列化代码如
student ss;
memcpy(&ss.id,ByteArray,sizeof(ss.id));
ss.name.append(ByteArray+4,count-4);
count += s.name.length();
其实在上述代码中存在问题只是memcpy函数隐藏了这个细节。在vs的内存窗口中我们可以看到s.id的内存视图为0c 00 00 00(16进制),这似乎和我们想的00 00 00 0c不一样,这就是所谓的大端系统(内存中高位字节在前)和小端系统(内存中低位字节在前),而目前我们的系统大多是小端系统,而一般在网络传输中却规定使用大端传输(如果不规定当我们将0c 00 00 00这四个字节传给对方,对方就不清楚这四个字节的值?0c 00 00 00 or 00 00 00 0c),我们用memcpy函数的时候实际上就是对内存的拷贝,而前面讲了在小端系统中对于s.id这个值拷贝到bytearray中的肯定是0c 00 00 00,然后接收端接收到的是0c 00 00 00以为你发是12的6次方(也不一定如果对端也是用的C语言直接用memcpy将0c 00 00 00拷贝s.id对应的内存,s.id的值还是12,就如上述代码,但是客户端和服务端的语言不一定一样),这显然与你想发的12差太多了 。
于是我们使用位操作(语言无关)来实现序列化与反序列化,以s.id为例代码如(注意位操作针对的是数值本身而非内存不要搞混了)
/*移位之后ByteArray中前四个字节存的便是00 00 00 0c*/
ByteArray[0] = s.id>>24;
ByteArray[1] = s.id>>26;
ByteArray[2] = s.id>>8;
ByteArray[3] = s.id;
接收端再移回来就行了,代码如
s.id += ByteArray[0]<<24;
s.id += ByteArray[1]<<16;
s.id += ByteArray[2]<<8;
s.id += ByteArray[3];
c++ 序列化和反序列化什么是序列化?为什么要序列化?优点在哪里?C++对象序列化的四种方法Google Protocol Buffers(protobuf)Boost.SerializationMFC SerializationNet Framework简单总结举例说明什么是序列化?序列化指的是将一个内存对象转化成一串字节数据(存储在一个字节数组中),可用于保存到本地文件或网络传输。反序列...
这里使用的json解析工具为JSON for Modern C++,使用的话仅需要包含头文件。
获取方式:wget https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp
json的序列化功能和map一样,用关联数组的"[]"来任意添加数据,不需要指定数据类型,它会自动推导。添加完之后用dump完成序列化,得到json形式的文本。
#include <iostream>
#include <vector
很多人都知道rapidjson这个json库,大家也都知道他的高效,可是你一定也对他的使用方法,函数API接口感受到非常不适应,你一定非常怀念使用java和C#对一个实体类的那么轻松加简单的直接json序列化,本篇博客使用一个RapidJsonHelper类,将帮你实现对一个C++实体类的的序列化和反序列化。rapidjson的版本是1.1。
//分配内存
unsigned char* strBuff = (unsigned char*)malloc(CALC_COMMON_ST_LEN(&CommonSt));
if (NULL == strBuff)
return NULL;
//填充内容
*(long*)s
程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这些过程将会涉及到程序数据转化成能被存储并传输的格式,因此被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化” (Deserialization)
简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用
特别注意:vc6太古老,不符合C++规范,无法使用该框架
1. 高性能,速度非常快,比你能找到的同类产品至少快一个数量级
2. 在网络通讯,数据库存储中非常好用。
3. 预先支持所有基本类型,所有stl容器类型(除stac
double sum1 = 0, sum2 = 0; // 初始化两个部分和
for (int i = 1; i <= n; i++) {
sum1 += i * i; // 计算平方部分和
sum2 += 1.0 / i; // 计算倒数部分和
cout << "sum1=" << sum1 << endl; // 输出平方部分和
cout << "sum2=" << sum2 << endl; // 输出倒数部分和
return 0;