【在Linux世界中追寻伟大的One Piece】手写序列化与反序列化

目录

1 -> 序列化与反序列化概念

2 -> 序列化与反序列化作用和应用场景

3 -> 手写序列化与反序列化


1 -> 序列化与反序列化概念

序列化是指将对象的状态信息转换为可以存储或传输的形式的过程,通常涉及将数据结构或对象转换成字节流或字符串格式。反序列化则是序列化的逆过程,即将序列化后的数据转换回原始的数据结构或对象。

2 -> 序列化与反序列化作用和应用场景

序列化和反序列化在软件开发中发挥着重要作用,尤其是在数据持久化、网络通信、分布式系统、远程方法调用(RMI)、Web服务、消息队列、移动应用、云服务和微服务架构等领域。它们使得数据可以在不同的系统、不同时刻之间进行有效的存储和传输。

3 -> 手写序列化与反序列化

#pragma once#include <iostream>
#include <memory>
#include <jsoncpp/json/json.h>// #define SelfDefine 1namespace Protocol
{// 问题// 1. 结构化数据的序列和反序列化// 2. 还要解决用户区分报文边界 --- 数据包粘报问题// 讲法// 1. 自定义协议// 2. 成熟方案序列和反序列化// 总结:// "protocol_code\r\nlen\r\nx op y\r\n" : \r\n 不属于报文的一部分,约定const std::string ProtSep = " ";const std::string LineBreakSep = "\r\n";// "len\r\nx 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\r\nx op y\r\n" : \r\n 不属于报文的一部分,约定// 我无法保证 package 就是一个独立的完整的报文// "l// "len// "len\r\n// "len\r\nx// "len\r\nx op// "len\r\nx op y// "len\r\nx op y\r\n"// "len\r\nx op y\r\n""len// "len\r\nx op y\r\n""len\n// "len\r\nx op// "len\r\nx op y\r\n""len\nx op y\r\n"// "len\r\nresult code\r\n""len\nresult code\r\n"bool Decode(std::string & package, std::string * message){// 除了解包,我还想判断报文的完整性, 能否正确处理具有"边界"的报文auto pos = package.find(LineBreakSep);if (pos == std::string::npos)return false;std::string lens = package.substr(0, pos);int messagelen = std::stoi(lens);int total = lens.size() + messagelen + 2 *LineBreakSep.size();if (package.size() < total)return false;// 至少 package 内部一定有一个完整的报文了!*message = package.substr(pos + LineBreakSep.size(),messagelen);package.erase(0, total);return true;}class Request{public:Request() : _data_x(0), _data_y(0), _oper(0){}Request(int x, int y, char op) : _data_x(x), _data_y(y),_oper(op){}void Debug(){std::cout << "_data_x: " << _data_x << std::endl;std::cout << "_data_y: " << _data_y << std::endl;std::cout << "_oper: " << _oper << std::endl;}void Inc(){_data_x++;_data_y++;}// 结构化数据->字符串bool Serialize(std::string* out){#ifdef SelfDefine // 条件编译* out = std::to_string(_data_x) + ProtSep + _oper +ProtSep + std::to_string(_data_y);return true;
#elseJson::Value root;root["datax"] = _data_x;root["datay"] = _data_y;root["oper"] = _oper;Json::FastWriter writer;*out = writer.write(root);return true;
#endif}bool Deserialize(std::string& in) // "x op y" [){
#ifdef SelfDefineauto left = in.find(ProtSep);if (left == std::string::npos)return false;auto right = in.rfind(ProtSep);if (right == std::string::npos)return false;_data_x = std::stoi(in.substr(0, left));_data_y = std::stoi(in.substr(right +ProtSep.size()));std::string oper = in.substr(left + ProtSep.size(),right - (left + ProtSep.size()));if (oper.size() != 1)return false;_oper = oper[0];return true;
#elseJson::Value root;Json::Reader reader;bool res = reader.parse(in, root);if (res){_data_x = root["datax"].asInt();_data_y = root["datay"].asInt();_oper = root["oper"].asInt();}return res;
#endif}int GetX() { return _data_x; }int GetY() { return _data_y; }char GetOper() { return _oper;}private:// _data_x _oper _data_y// 报文的自描述字段// "len\r\nx op y\r\n" : \r\n 不属于报文的一部分,约定// 很多工作都是在做字符串处理!int _data_x; // 第一个参数int _data_y; // 第二个参数char _oper; // + - * / %};class Response{public:Response() : _result(0), _code(0){}Response(int result, int code) : _result(result),_code(code){}bool Serialize(std::string* out){
#ifdef SelfDefine* out = std::to_string(_result) + ProtSep +std::to_string(_code);return true;
#elseJson::Value root;root["result"] = _result;root["code"] = _code;Json::FastWriter writer;*out = writer.write(root);return true;
#endif}bool Deserialize(std::string& in) // "_result _code" [){
#ifdef SelfDefineauto pos = in.find(ProtSep);if (pos == std::string::npos)return false;_result = std::stoi(in.substr(0, pos));_code = std::stoi(in.substr(pos + ProtSep.size()));return true;
#elseJson::Value root;Json::Reader reader;bool res = reader.parse(in, root);if (res){_result = root["result"].asInt();_code = root["code"].asInt();}return res;
#endif}void SetResult(int res) { _result = res; }void SetCode(int code) { _code = code; }int GetResult() { return _result; }int GetCode() { return _code;}private:// "len\r\n_result _code\r\n"int _result; // 运算结果int _code; // 运算状态};// 简单的工厂模式,建造类设计模式class Factory{public:std::shared_ptr<Request> BuildRequest(){std::shared_ptr<Request> req =std::make_shared<Request>();return req;}std::shared_ptr<Request> BuildRequest(int x, int y, charop){std::shared_ptr<Request> req =std::make_shared<Request>(x, y, op);return req;}std::shared_ptr<Response> BuildResponse(){std::shared_ptr<Response> resp =std::make_shared<Response>();return resp;}std::shared_ptr<Response> BuildResponse(int result, intcode){std::shared_ptr<Response> req =std::make_shared<Response>(result, code);return req;}};
}

感谢各位大佬支持!!!

互三啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp自动注册机制:easycom

传统 Vue 项目中&#xff0c;我们需要注册、导入组件之后才能使用组件。 uniapp 框架提供了一种组件自动注册机制&#xff0c;只要你在 components 文件夹下新建的组件满足 /components/组件名/组件名.vue 的命名规范&#xff0c;就能直接使用。 注意&#xff1a;组件的文件夹…

springboot基于微信小程序的停车场管理系统

摘 要 停车场管理系统是一种基于移动端的应用程序&#xff0c;旨在方便车主停车的事务办理。该小程序提供了便捷的停车和功能&#xff0c;使车主能够快速完成各项必要的手续和信息填写。旨在提供一种便捷、高效的预约停车方式&#xff0c;减少停车手续的时间和精力成本。通过该…

AI技术在电商行业的创新应用与未来发展

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

.NET9 - 新功能体验(一)

被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.NET版本”——.NET 9已经发布有一周了&#xff0c;今天想和大家一起体验一下新功能。 此次.NET 9在性能、安全性和功能等方面进行了大量改进&#xff0c;包含了数千项的修改&#xff0c;今天主要和大家一起体…

【Oracle篇】SQL性能优化实战案例(从15秒优化到0.08秒)(第七篇,总共七篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

神经网络入门实战:(一)神经网络解决的两种问题,以及AI、机器学习、深度学习三者之间的逻辑关系

AI、机器学习、深度学习三者之间的逻辑关系&#xff1a; 两种问题 &#xff08;1&#xff09;回归问题 回归问题是指预测一个或多个连续值的任务。这些连续值可以是任意实数&#xff0c;比如价格、温度、分数等。 回归问题的目标通常是 找到一个函数 &#xff0c;该函数可以…

深入解析TK技术下视频音频不同步的成因与解决方案

随着互联网和数字视频技术的飞速发展&#xff0c;音视频同步问题逐渐成为网络视频播放、直播、编辑等过程中不可忽视的技术难题。尤其是在采用TK&#xff08;Transmission Keying&#xff09;技术进行视频传输时&#xff0c;由于其特殊的时序同步要求&#xff0c;音视频不同步现…

豆包MarsCode算法题:最小周长巧克力板组合

问题描述 思路分析 这道题可以抽象为一个最优化问题&#xff1a; 问题分析 每个正方形的面积为 k &#xff0c;对应的边长为 k &#xff0c;周长为 4k 。给定整数 n &#xff0c;我们需要找到若干正方形&#xff0c;使得它们的面积之和恰好等于 n&#xff1a; 同时尽量最小…

解析与修复vcruntime140_1.dll问题,总结四种vcruntime140_1.dll解决方法

在使用Windows系统的过程中&#xff0c;不少用户可能会遇到与vcruntime140_1.dll相关的问题。这个看似神秘的文件&#xff0c;其实在很多软件的运行中扮演着至关重要的角色。今天的这篇文章将教大家四种vcruntime140_1.dll解决方法。 一、vcruntime140_1.dll文件分析 &#xf…

WebGL进阶(九)光线

理论基础&#xff1a; 点光源 符合向量定义&#xff0c;末减初。 平行光 环境光 效果&#xff1a; 点光源 平行光 环境光 源码&#xff1a; 点光源 平行光 环境光 复盘&#xff1a;

【Amazon】亚马逊云科技Amazon DynamoDB 实践Amazon DynamoDB

Amazon DynamoDB 是一种完全托管的 NoSQL 数据库服务&#xff0c;专为高性能和可扩展性设计&#xff0c;特别适合需要快速响应和高吞吐量的应用场景&#xff0c;如移动应用、游戏、物联网和实时分析等。 工作原理 Amazon DynamoDB 在任何规模下响应时间一律达毫秒级&#xff…

【AIGC】ChatGPT提示词Prompt解析:拒绝的艺术:如何优雅地说“不“

引言 在人际交往的复杂网络中,学会优雅地拒绝是一种至关重要的社交智慧。很多人往往因为害怕伤害他人的感受,而选择敷衍、拖延或不置可否。 然而,真正的智慧在于如何用尊重和同理心传达"不"的信息。 本文将深入探讨优雅拒绝的艺术,帮助你在维护自身边界的同时,…

Java项目实战II基于微信小程序的农场驿站平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着移动互…

支付宝租赁小程序的优势与应用前景分析

内容概要 在这个快节奏的时代&#xff0c;租赁服务越来越成为大家生活中的一部分。而支付宝租赁小程序正是这个大潮流中的一颗璀璨明珠。通过简单易用的界面和强大的功能&#xff0c;这个小程序不仅让用户在租赁过程中获得了前所未有的便利&#xff0c;也为商家提供了新的商业…

Elasticsearch 中的热点以及如何使用 AutoOps 解决它们

作者&#xff1a;来自 Elastic Sachin Frayne 探索 Elasticsearch 中的热点以及如何使用 AutoOps 解决它。 Elasticsearch 集群中出现热点的方式有很多种。有些我们可以控制&#xff0c;比如吵闹的邻居&#xff0c;有些我们控制得较差&#xff0c;比如 Elasticsearch 中的分片分…

【H2O2|全栈】JS进阶知识(七)ES6(3)

目录 前言 开篇语 准备工作 递归 概念 形式 优缺点 案例 数组求和 斐波那契数列 递归查找数据 柯里化 概念 形式 什么时候使用柯里化&#xff1f; 多维数组扁平化 多维数组 扁平化 利用flat() 与字符串相互转化 与JSON字符串相互转化 some()&#xff0c;…

【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍

文章目录 前言一、Zachman架构二、ToGAF架构三、FEA架构四、DoDAF 前言 企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;是指企业在信息技术和业务流程方面的整体设计和规划。 最近接触到“企业架构”这个概念&#xff0c;转念一想必定和我们软件架构…

迷宫题解 题目ID:8015

题目描述 时间限制&#xff1a; 1s 空间限制&#xff1a;32M 题目描述&#xff1a; 给定一个N∗M 方格的迷宫&#xff0c;每个方格最多经过一次&#xff0c;且迷宫里有 T 处障碍&#xff0c;障碍处不可通过。 在迷宫中有上下左右四种移动方式&#xff0c;每次只能移动一个方…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…

Python中常用的内置函数介绍

1、生成器&#xff08;Generator&#xff09;&#xff1a; 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受到内存限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#x…