1 -> 序列化与反序列化概念
序列化是指将对象的状态信息转换为可以存储或传输的形式的过程,通常涉及将数据结构或对象转换成字节流或字符串格式。反序列化则是序列化的逆过程,即将序列化后的数据转换回原始的数据结构或对象。
2 -> 序列化与反序列化作用和应用场景
序列化和反序列化在软件开发中发挥着重要作用,尤其是在数据持久化、网络通信、分布式系统、远程方法调用 (RMI)、Web 服务、消息队列、移动应用、云服务和微服务架构等领域。它们使得数据可以在不同的系统、不同时刻之间进行有效的存储和传输。
3 -> 手写序列化与反序列化
#pragma once
#include <iostream>
#include <memory>
#include <jsoncpp/json/json.h>
// #define SelfDefine 1
namespace Protocol {
// 问题
// 1. 结构化数据的序列和反序列化
// 2. 还要解决用户区分报文边界 --- 数据包粘报问题
// 讲法
// 1. 自定义协议
// 2. 成熟方案序列和反序列化
// 总结:
// "protocol_code\r\nlen\rx op y\r\n" : \r\n 不属于报文的一部分,约定
const std::string LineBreakSep = "\r\n";
// "len\rx op y\r\n" : \r\n 不属于报文的一部分,约定
std::string Encode(const std::string& message) {
std::string len = std::to_string(message.size());
std::string package = len + LineBreakSep + message + LineBreakSep;
return package;
}
// "len\rx op y\r\n" : \r\n 不属于报文的一部分,约定
// 我无法保证 package 就是一个独立的完整的报文
// "l // "len // "len\r\n // "len\rx // "len\rx op // "len\rx op y // "len\rx op y\r\n"
// "len\rx op y\r\n""len // "len\rx op y\r\n""len\n // "len\rx op // "len\rx op y\r\n""len\nx op y\r\n"
{
pos = package.(LineBreakSep);
(pos == std::string::npos) ;
std::string lens = package.(, pos);
messagelen = std::(lens);
total = lens.() + messagelen + * LineBreakSep.();
(package.() < total) ;
*message = package.(pos + LineBreakSep.(), messagelen);
package.(, total);
;
}
{
:
() : _data_x(), _data_y(), _oper() { }
( x, y, op) : _data_x(x), _data_y(y), _oper(op) { }
{
std::cout << << _data_x << std::endl;
std::cout << << _data_y << std::endl;
std::cout << << _oper << std::endl;
}
{ _data_x++; _data_y++; }
{
*out = std::(_data_x) + ProtSep + _oper + ProtSep + std::(_data_y);
;
Json::Value root;
root[] = _data_x;
root[] = _data_y;
root[] = _oper;
Json::FastWriter writer;
*out = writer.(root);
;
}
{
left = in.(ProtSep);
(left == std::string::npos) ;
right = in.(ProtSep);
(right == std::string::npos) ;
_data_x = std::(in.(, left));
_data_y = std::(in.(right + ProtSep.()));
std::string oper = in.(left + ProtSep.(), right - (left + ProtSep.()));
(oper.() != ) ;
_oper = oper[];
;
Json::Value root;
Json::Reader reader;
res = reader.(in, root);
(res) {
_data_x = root[].();
_data_y = root[].();
_oper = root[].();
}
res;
}
{ _data_x; }
{ _data_y; }
{ _oper; }
:
_data_x;
_data_y;
_oper;
};
{
:
() : _result(), _code() { }
( result, code) : _result(result), _code(code) { }
{
*out = std::(_result) + ProtSep + std::(_code);
;
Json::Value root;
root[] = _result;
root[] = _code;
Json::FastWriter writer;
*out = writer.(root);
;
}
{
pos = in.(ProtSep);
(pos == std::string::npos) ;
_result = std::(in.(, pos));
_code = std::(in.(pos + ProtSep.()));
;
Json::Value root;
Json::Reader reader;
res = reader.(in, root);
(res) {
_result = root[].();
_code = root[].();
}
res;
}
{ _result = res; }
{ _code = code; }
{ _result; }
{ _code; }
:
_result;
_code;
};
{
:
{
std::shared_ptr<Request> req = std::<Request>();
req;
}
{
std::shared_ptr<Request> req = std::<Request>(x, y, op);
req;
}
{
std::shared_ptr<Response> resp = std::<Response>();
resp;
}
{
std::shared_ptr<Response> req = std::<Response>(result, code);
req;
}
};
}


