珠海手机网站建设,宝塔和WordPress一样吗,游戏网页版入口,家具网站首页设计本文首发于 慕雪的寒舍
以tcpServer的计算器服务为例#xff0c;实现用jsoncpp来进行序列化和反序列化 阅读本文之前#xff0c;请先阅读 自定义协议 | 序列化和反序列化 | 以tcpServer为例 1.安装jsoncpp
我所用的系统是centos7.6#xff0c;先用下面的命令查找相关的包 …本文首发于 慕雪的寒舍
以tcpServer的计算器服务为例实现用jsoncpp来进行序列化和反序列化 阅读本文之前请先阅读 自定义协议 | 序列化和反序列化 | 以tcpServer为例 1.安装jsoncpp
我所用的系统是centos7.6先用下面的命令查找相关的包
sudo yum list | grep jsoncpp-devel显示出来的包如下
Repository epel is listed more than once in the configuration
jsoncpp-devel.x86_64 0.10.5-2.el7 epel 随后安装这个包
sudo yum install jsoncpp不知道为什么安装jsoncpp-devel.x86_64显示找不到相关包
或者采用下面的两个命令
sudo yum install epel-release
sudo yum install jsoncpp-devel如果执行完毕后显示找不到jsoncpp尝试重新安装epel-release 刚开始我显示epel已经安装但是找不到jsoncpp这个包我在重新安装了epel后就能正常安装了
sudo yum rm epel-release
sudo yum install epel-release
sudo yum install jsoncpp-devel如下图正常查找到并安装完毕 在centos8下安装完毕后路径如下
$ ls /usr/include/json
allocator.h assertions.h autolink.h config.h features.h forwards.h json.h reader.h value.h version.h writer.h1.1 什么是json
json是一个kv键值对的序列化方式每一个key都对应了一个value
{data: value
}这就有点类似c中的map不过json能做的更多
{data1: value,data2: {key1:value1,key2:value2,key3:0,key4:true}
}json可以在里面嵌套添加更多的内容不管是字符串还是整形还能是bool类型的true/false
因为json对反序列化序列化的控制很是不错可读性也很好所以被广泛使用
相比于自己写一个序列化方式直接用别人的轮子也不错
类似的序列化框架还有xml
2.代码示例
2.1 序列化
相比我们自己写的序列化方式json的使用简单多了
void serialize(std::string out)
{//使用jsoncpp的代码Json::Value root;root[x] _x;root[y] _y;root[op] _ops;Json::FastWriter fw; // 这个是写成一行对于计算机来说处理的负担小// Json::StyledWriter fw; // 这个会进行格式化更好看但是内容没差距out fw.write(root);
}对于fw.write(root)其返回值是一个string也方便我们接收 其中FastWriter和StyledWriter有一点区别如下
//FastWriter
{data: value}
//StyledWriter
{data: value
}简单来说StyledWriter会对我们的kv键值对进行格式化更方便人类的阅读。而FastWriter是直接写成一整行在传输的时候会方便一点因为不需要\n
2.2 反序列化
反序列化需要一个Reader来读取字符串并将其内容根据键值隐射给成员变量
bool deserialize(const std::string in)
{//jsonJson::Value root;Json::Reader rd;rd.parse(in, root);_x root[x].asInt();_y root[y].asInt();_ops root[op].asInt();
}3.测试
因为jsoncpp是一个第三方库我们链接的时候需要加上命令-ljsoncpp
tcpServer:tcpServer.cppg -o $ $^ -stdc11 -lpthread -ljsoncpp发送消息后可以看到json帮我们格式化为如下形式的字符串
{op:43,x:1,y:200}
{op:43,x:333,y:234}4.gcc给予宏定义
为了方便对序列化采用的方式进行控制这里我使用了预处理指令ifdef/endif来进行判断只要我们在文件头定义了MYPROTOCOL这里就会采用我们自己的写的序列化方式否则采用json
#define MYPROTOCOL 1 //如果define了这个那就使用自己的代码4.1 命令行
但是在文件里面修改define还是不太方便我们可以直接采用gcc的命令行参数的方式进行define的插入这么做之前要先删除文件中对MYPROTOCOL的define
g -DMYPROTOCOL tcpServer.cpp -o tcpServer -lpthread -ljsoncpp
g -DMYPROTOCOL tcpClient.cpp -o tcpClient -lpthread -ljsoncpp可以看到不加编译指令编译出来的服务器采用的是json的方式来序列化 添加了之后就是用我们自己写的序列化方式来序列化了 4.2 makefile
因此我们可以修改makefile来实现这一点
.PHONY:all
all:tcpClient tcpServer
MYSELF-DMYPROTOCOLtcpClient: tcpClient.cppg $(MYSELF) -o $ $^ -stdc11 -lpthread -ljsoncpp
tcpServer:tcpServer.cppg $(MYSELF) -o $ $^ -stdc11 -lpthread -ljsoncpp.PHONY:clean
clean:rm -f tcpClient tcpServer当我们需要用自己协议的时候就在最前面加上
MYSELF-DMYPROTOCOL否则直接删除这个定义或者注释掉后面的内容就能采用jsoncpp
MYSELF#-DMYPROTOCOL这样就方便一些了