欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 序列化和反序列化【网络】

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

2024/10/25 21:29:18 来源:https://blog.csdn.net/qq_73478334/article/details/142416884  浏览:    关键词:序列化和反序列化【网络】

文章目录

  • 序列化&&反序列化
  • 代码

序列化&&反序列化

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

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

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}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com