【网络】自定义协议 | 序列化和反序列化 | Jsoncpp
以 tcpServer 的计算器服务为例,实现用 jsoncpp 来进行序列化和反序列化
阅读本文之前,请先阅读 自定义协议 | 序列化和反序列化 | 以 tcpServer 为例
1. 安装 jsoncpp
我所用的系统是 centos7.6
,先用下面的命令查找相关的包
1 | sudo yum list | grep jsoncpp-devel |
显示出来的包如下
1 | Repository epel is listed more than once in the configuration |
随后安装这个包
1 | sudo yum install jsoncpp |
不知道为什么,安装 jsoncpp-devel.x86_64
显示找不到相关包
或者采用下面的两个命令
1 | sudo yum install epel-release |
如果执行完毕后显示找不到 jsoncpp,尝试重新安装 epel-release
刚开始我显示 epel 已经安装,但是找不到 jsoncpp 这个包,我在重新安装了 epel 后就能正常安装了
1 | sudo yum rm epel-release |
如下图,正常查找到并安装完毕
在 centos8 下,安装完毕后路径如下
1 | $ ls /usr/include/json |
1.1 什么是 json?
json 是一个 kv 键值对的序列化方式,每一个 key 都对应了一个 value
1 | { |
这就有点类似 c++ 中的 map,不过 json 能做的更多
1 | { |
json 可以在里面嵌套添加更多的内容,不管是字符串还是整形,还能是 bool 类型的 true/false
;
因为 json 对反序列化序列化的控制很是不错,可读性也很好,所以被广泛使用!
相比于自己写一个序列化方式,直接用别人的轮子,也不错👻
类似的序列化框架还有 xml
2. 代码示例
2.1 序列化
相比我们自己写的序列化方式,json 的使用简单多了
1 | void serialize(std::string& out) |
对于 fw.write(root)
,其返回值是一个 string,也方便我们接收
其中 FastWriter
和 StyledWriter
有一点区别,如下
1 | //FastWriter |
简单来说,StyledWriter
会对我们的 kv 键值对进行格式化,更方便人类的阅读。而 FastWriter
是直接写成一整行,在传输的时候会方便一点(因为不需要 \n
)
2.2 反序列化
反序列化需要一个 Reader 来读取字符串,并将其内容根据键值隐射给成员变量
1 | bool deserialize(const std::string &in) |
3. 测试
因为 jsoncpp 是一个第三方库,我们链接的时候需要加上命令 -ljsoncpp
1 | tcpServer:tcpServer.cpp |
发送消息后,可以看到,json 帮我们格式化为如下形式的字符串
1 | {"op":43,"x":1,"y":200} |
4.gcc 给予宏定义
为了方便对序列化采用的方式进行控制,这里我使用了预处理指令 ifdef/endif
来进行判断,只要我们在文件头定义了 MYPROTOCOL
,这里就会采用我们自己的写的序列化方式,否则采用 json
1 |
4.1 命令行
但是在文件里面修改 define 还是不太方便,我们可以直接采用 gcc 的命令行参数的方式,进行 define 的插入(这么做之前,要先删除文件中对 MYPROTOCOL
的 define)
1 | g++ -DMYPROTOCOL tcpServer.cpp -o tcpServer -lpthread -ljsoncpp |
可以看到,不加编译指令编译出来的服务器,采用的是 json 的方式来序列化
添加了之后,就是用我们自己写的序列化方式来序列化了
4.2 makefile
因此,我们可以修改 makefile 来实现这一点
1 |
|
当我们需要用自己协议的时候,就在最前面加上
1 | MYSELF=-DMYPROTOCOL |
否则直接删除这个定义,或者注释掉后面的内容,就能采用 jsoncpp
1 | MYSELF=#-DMYPROTOCOL |
这样就方便一些了
- 最新
- 最热
- 最早
- 作者
点击重新获取 | 打开控制台