目录
1. 序列化和反序列化的简单介绍
2. 使用 json 组件完成数据的序列化和反序列化
1. 安装 jsoncpp 组件
2. 序列化
3. 反序列化
Linux网络编程✨
1. 序列化和反序列化的简单介绍
序列化:将一个结构体数据转化为字符串数据;
反序列化:将一个字符串数据转化为结构体数据;
你和你的朋友使用QQ程序进行通信例子:
当你向你的朋友发送一个消息时,这个消息其实是一个结构化的数据,包含昵称、头像、消息内容、时间等信息。这种结构化的数据是不便于网络传输的,因此在网络传输前,要进行一个序列化的过程:将这个结构化的数据转化成为一个长的 “字符串” 在网络中传输。当你的朋友收到你的信息前,这个 “字符串” 的数据要进行一个反序列化的过程,将这个 “字符串” 数据转化成为一个结构化的数据,更好的进行一个界面的显示。
序列化和反序列化的原因?
1. 序列化的数据方便网络的传输;
2. 反序列化的数据方便用户的通信;
3. 将应用和网络进行了解耦 ;
2. 使用 json 组件完成数据的序列化和反序列化
1. 安装 jsoncpp 组件
使用 json 组件的话我们要先使用如下命令对其进行安装:
sudo yum install -y jsoncpp-devel
出现如下字样则表示成功:
2. 序列化
序列化有两种风格:StyledWriter、FastWriter
下面分别来看一下这两种序列化的结果;
StyledWriter:
源代码:
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
//仅仅是为了解释序列化和反序列化
typedef struct request
{
int x;
int y;
char op;
}request_t;
int main()
{
//序列化的过程
request_t req = {10, 20, '*'};
//可以承装任何对象,json是一种kv式的序列化方案
Json::Value root;
root["datax"] = req.x;
root["datay"] = req.y;
root["operator"] = req.op;
Json::StyledWriter writer;
std::string json_string = writer.write(root);
std::cout << json_string << std::endl;
return 0;
}
实验结果:
编译的时候,要在后面加上 -ljsoncpp 告诉链接的是哪个库;
FastWriter:
源代码:
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
//仅仅是为了解释序列化和反序列化
typedef struct request
{
int x;
int y;
char op;
}request_t;
int main()
{
//序列化的过程
request_t req = {10, 20, '*'};
//可以承装任何对象,json是一种kv式的序列化方案
Json::Value root;
root["datax"] = req.x;
root["datay"] = req.y;
root["operator"] = req.op;
Json::FastWriter writer;
std::string json_string = writer.write(root);
std::cout << json_string << std::endl;
return 0;
}
实验结果:
3. 反序列化
源代码:
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
//仅仅是为了解释序列化和反序列化
typedef struct request
{
int x;
int y;
char op;
}request_t;
int main()
{
//反序列化
std::string json_string = R"({"datax":10,"datay":20,"operator":42})";
Json::Reader reader;
Json::Value root;
reader.parse(json_string, root);
request_t req;
req.x = root["datax"].asInt();
req.y = root["datay"].asInt();
req.op = (char)root["operator"].asInt();
std::cout << req.x << " " << req.op << " " << req.y << std::endl;
return 0;
}
实验结果:
如果上述文章对您有所帮助的话,还请点赞👍,收藏😉,关注🎈