序列化和自定义协议

序言

 在上一篇文章中,我们介绍了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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值