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