文章目录
- 序列化&&反序列化
- 代码
序列化&&反序列化
序列化是将对象的状态信息转换为可以存储或传输的形式(字节序列)的过程。
反序列化是把字节序列恢复为对象的过程
例如:进行在线聊天时,客户端发送的一句消息 ,服务端不单单只收到一条消息,还包含消息内容、发送时间、发送者的昵称等内容
序列化可以理解为,将消息内容、发送时间、发送者的昵称,结构化,再将结构化的数据转换为一个大字符串
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}