序言
在上一篇文章中,我们介绍了Socket 编程,已经可以简单地使用该方法来进行服务端和客户端的数据了。在这篇文章中我们将在此基础上学习序列化和反序列化,以及在应用层上自定义协议。
序列化和反序列化
1. 为什么需要序列化和反序列化?
在 Socket 编程
的学习中,客户端给服务端传输的数据全是字符串,但是如果我们有传输对象或者是结构体
的需求怎么办呢?
首先我们需要知道在网络通信中,直接传输对象或复杂数据结构通常是不可行的
,因为网络协议通常只支持字节流或字符流的传输。所以想要传输结构体我们就首先需要将该结构体或对象序列化!序列化可以将这些对象或数据结构转换为字节序列(如二进制格式)或字符序列(如JSON、XML
等),从而在网络中传输。
2. 安装 Json 库
Jsoncpp
是一个用于处理 JSON
数据的 C++
库。它提供了将 JSON 数据序列化为字 符串以及从字符串反序列化为 C++ 数据结构的功能
。Jsoncpp
是开源的,广泛用于各种需要处理 JSON
数据的 C++
项目中。
我们在这里将简单的带大家上手这个库,首先我们需要安装这个库,在 Linux
输入指令:
ubuntu:sudo apt-get install libjsoncpp-dev
3. 数据序列化
我们构造一个简单的结构体只包含内置类型的数据:
struct MyData
{
MyData(int left, int right, char oper)
: _left(left)
, _right(right)
, _oper(oper)
{
}
int _left;
int _right;
char _oper;
};
现在我们初始化一个结构体对象,Json::Value对象
,并使用结构体的数据填充该Json
:
// 初始化一个对象
MyData d1(1, 2, '-');
// 创建一个 Json::Value 对象,它将用于构建 JSON
Json::Value root;
// 填充 Json 对象
root["Left"] = d1._left;
root["Right"] = d1._right;
root["Oper"] = d1._oper;
JSON
已经构建好了,现在我们只需要格式化输出字符串就行了:
// FastWriter 的效率比较好,因为不需要额外的输出空格,换行符
Json::FastWriter write;
std::string result = write.