序列化和反序列化【网络】

序列化&&反序列化

序列化是将对象的状态信息转换为可以存储或传输的形式(字节序列)的过程。
反序列化是把字节序列恢复为对象的过程

例如:进行在线聊天时,客户端发送的一句消息 ,服务端不单单只收到一条消息,还包含消息内容、发送时间、发送者的昵称等内容
序列化可以理解为,将消息内容、发送时间、发送者的昵称,结构化,再将结构化的数据转换为一个大字符串

struct msg
{
string  Info ;//消息内容
string  time ;//发送时间
string name ;//发送者的昵称
};

反序列化可以理解为,服务端将客户端经过网络发过来的结构化的数据,以对象的方式将结构化的数据打散,拿到Info 、time 、name 这些具体的信息

在网络传输时,序列化目的是为了方便网络数据的发送和接收,无论是何种类型的数据,经过序列化后都变成了二进制序列,此时底层在进行网络数据传输时看到的统一都是二进制序列。
序列化后的二进制序列只有在网络传输时能够被底层识别,上层应用是无法识别序列化后的二进制序列的,因此需要将从网络中获取到的数据进行反序列化,将二进制序列的数据转换成应用层能够识别的数据格式。

代码

实现一个网络版本的计算器:
序列化&&反序列化&&自定义协议

bool Serialize(std::string *out) // 序列化
    {
#ifdef Myself
        //"9\n"100 + 200\n"
        // 报头:长度\n

        // 构建报文的有效载荷,"x op y"
        std::string s = std::to_string(x);
        s += blank_space_sep;
        s += op;
        s += blank_space_sep;
        s += std::to_string(y);
        *out = s;
        return true;
#else
        // JSON 格式来序列化数据
        Json::Value root;
        root["x"] = x;
        root["y"] = y;
        root["op"] = op;
        // Json::FastWriter w;
        // 序列化
        Json::StyledWriter w;
        *out = w.write(root);
        return true;

#endif
    }

    bool DeSerialize(const std::string &in) // 反序列化
    {
#ifdef Myself
        //"9\n"100 + 200\n"
        size_t left = in.find(blank_space_sep);
        if (left == std::string::npos)
            return false; // 没有找到
        // 找到空格
        std::string part_x = in.substr(0, left);
        size_t right = in.rfind(blank_space_sep);
        if (right == std::string::npos)
            return false; // 没有找到
        std::string part_y = in.substr(right + 1);
        // 不是一个完整的报文
        if (left + 2 != right)
            return false;
        op = in[left + 1];
        x = std::stoi(part_x);
        y = std::stoi(part_y);

        return true;
#else
        // JSON 格式来反序列化数据
        Json::Value root;
        Json::Reader r;
        r.parse(in, root);

        x = root["x"].asInt();
        y = root["y"].asInt();
        op = root["op"].asInt();
        return true;
#endif
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鄃鳕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值