远程过程调用-buttonrpc源码解析1-序列化

分析buttonrpc中的序列化
源码提供了StreamBuffer类,该类继承自vector<char>,用来存储数据。

// 此处省略实现...
class StreamBuffer : public vector<char>
{};

并提供了Serializer类,用来序列化数据。

// 此处省略部分实现...
class Serializer
{
public:enum ByteOrder {BigEndian,LittleEndian};void byte_orser(char* in, int len);template<typename T>void output_type(T& t);template<typename T>void input_type(T t);template<typename T>Serializer &operator >> (T& i){output_type(i); return *this;}template<typename T>Serializer &operator << (T i){input_type(i);return *this;}private:int  m_byteorder;StreamBuffer m_iodevice;
};

其中,成员变量m_byteorder定义了大小端模式,成员函数byte_orser(char* in, int len)进行大小端转换。
好奇:byte_orser函数名是不是写错了,应该是byte_order吧?

inline void Serializer::byte_orser(char* in, int len)
{if (m_byteorder == BigEndian){reverse(in, in+len);}
}

类中提供了流入函数operator << (T i)和流出函数operator >> (T& i),具体实现由私有成员函数
input_typeoutput_type提供。流入操作实现如下:
好奇:operator << (T i)函数应该定义为operator << (const T &i)吧?

// 1、定义泛化版本
template<typename T>
inline void Serializer::input_type(T t)
{int len = sizeof(T);char* d = new char[len];const char* p = reinterpret_cast<const char*>(&t);memcpy(d, p, len);byte_orser(d, len);m_iodevice.input(d, len);delete [] d;
}// 2、定义特化版本:针对string类型进行特化处理
template<>
inline void Serializer::input_type(std::string in)
{// 先存入字符串长度uint16_t len = in.size();char* p = reinterpret_cast< char*>(&len);byte_orser(p, sizeof(uint16_t));m_iodevice.input(p, sizeof(uint16_t));// 存入字符串if (len == 0) return;char* d = new char[len];memcpy(d, in.c_str(), len);m_iodevice.input(d, len);delete [] d;
}// 3、定义特化版本:针对char *类型数据,转换为string类型进行处理
template<>
inline void Serializer::input_type(const char* in)
{input_type<std::string>(std::string(in));
}

流出操作实现如下:

template<typename T>
inline void Serializer::output_type(T& t)
{int len = sizeof(T);char* d = new char[len];if (!m_iodevice.is_eof()){memcpy(d, m_iodevice.current(), len);m_iodevice.offset(len);byte_orser(d, len);t = *reinterpret_cast<T*>(&d[0]);}delete [] d;
}template<>
inline void Serializer::output_type(std::string& in)
{int marklen = sizeof(uint16_t);char* d = new char[marklen];memcpy(d, m_iodevice.current(), marklen);byte_orser(d, marklen);int len = *reinterpret_cast<uint16_t*>(&d[0]);m_iodevice.offset(marklen);delete [] d;if (len == 0) return;in.insert(in.begin(), m_iodevice.current(), m_iodevice.current() + len);m_iodevice.offset(len);
}

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

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

相关文章

pta上的几个例题

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

1258:【例9.2】数字金字塔-----动态规划(递推)1

题目网址 1258&#xff1a;【例9.2】数字金字塔 首先解这道题我们第一眼想到是不是暴力&#xff0c;但是暴力的话是O(n!)的时间复杂度&#xff0c;很明显&#xff0c;会超时。那怎么办呢&#xff1f;不如我们把他分成若干子问题把&#xff0c;就像分治那样。 首先我们想得到答案…

vue2 项目中使用clipboard复制插件

需求&#xff0c;点击页面中的某一个按钮&#xff0c;复制文字。 npm install clipboard --save 在组件中使用 import Clipboard from clipboard html中的按钮 <div ref"main" class"main"><button click"copy">copy</button…

Android Studio实现内容丰富的安卓校园新闻浏览平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号070 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看新闻列表 3.查看新闻详情 4.评论新闻 5.收藏新闻 6…

解决VMware无法检测此光盘映像中的操作系统

今天我本想在VMware上安装一个win10系统&#xff0c;可是遇到“无法检测此光盘映像中的操作系统。您需要指定要安装的操作系统。”的错误。报错如下&#xff1a; 图一 遇到的问题 开始还以为是ISO文件有问题&#xff0c;重新下载了几个还是不行&#xff08;一个ISO文件好几个G&…

免费SSL证书Let‘sEncrypt安装

1. Let’sEncrypt说明&#xff1a; Lets Encrypt 是免费、开放和自动化的证书颁发机构由Linux基金会(Linux Foundation)进行日常管理维护&#xff0c;它为36.3亿个网站提供TLS证书的非盈利性证书颁发机构, 通过它我们可以免费申请网站证书&#xff0c;并您的网站上启用 HTTPS …

APP专项测试

一、介绍 APP测试除了功能测试外&#xff0c;还需要进行一些专项测试来发现更为深层的问题&#xff0c;这些问题主要是针对某个特殊方面进行&#xff0c;如安装卸载升级测试、兼容性测试、弱网测试、中断测试、流量测试、耗电量测试等。 二 、安装卸载升级测试 APP开发后&am…

联想拯救者刃7000K2024游戏电脑主机仅售6999元

这款联想拯救者刀锋7000K 2024游戏电脑主机在京东促销中售价仅为6999元&#xff0c;相比原价7499元有相当大的折扣。 这是一款功能强大的游戏电脑&#xff0c;配备了全新的 15-14400(F) 处理器和 RTX™ 4060 显卡&#xff0c;以及 16GB DDR5 内存和 1TB 固态硬盘。 外观方面&a…

如何有效地组织和管理自己的代码?

如何有效地组织和管理自己的代码&#xff1f; &#x1f9e9; &#x1f6e0;️ 如何有效地组织和管理自己的代码&#xff1f; &#x1f9e9;摘要引言正文1. 使用合适的目录结构2. 模块化设计3. 命名规范4. 版本控制 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页——…

3.Redis命令

Redis命令 Redis 根据命令所操作对象的不同&#xff0c; 可以分为三大类&#xff1a; 对 Redis 进行基础性操作的命令&#xff0c;对 Key 的操作命令&#xff0c;对 Value 的操作命令。 1.1 Redis 首先通过 redis-cli 命令进入到 Redis 命令行客户端&#xff0c;然后再运行下…

STM32基础--使用寄存器点亮流水灯

GPIO 简介 GPIO 是通用输入输出端口的简称&#xff0c;简单来说就是 STM32 可控制的引脚&#xff0c;STM32 芯片的 GPIO 引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO被分成很多组&#xff0c;每组有 16 个引脚&#xf…

多源BFS

目录 算法原理 多源BFS步骤&#xff1a; 1、542. 01 矩阵 2、1020. 飞地的数量 3、1765. 地图中的最高点 4、1162. 地图分析 多源BFS&#xff08;Breadth-First Search&#xff0c;广度优先搜索&#xff09;是解决边权为1的多源最短路径问题的有效算法。在这种情况下&…

【模拟string函数的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 模拟string函数的实现 浅拷贝 深拷贝 vs和g下string结构的说明 总结 前言 模拟string函数的实现 浅拷贝 深拷贝 总结 前言 世上有两种耀眼的光芒&#…

Java面向对象案例之描述专业和学生(4)

类的方法图 学生类&#xff1a; 属性&#xff1a;学号&#xff0c;姓名&#xff0c;年龄&#xff0c;所学习的专业方法&#xff1a;学习的方法&#xff0c;描述学习状态。描述内容包括姓名、学号、年龄、所学习的专业信息 专业类&#xff1a; 属性&#xff1a;专业编号&#xf…

2024年【天津市安全员C证】考试资料及天津市安全员C证考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证考试资料根据新天津市安全员C证考试大纲要求&#xff0c;安全生产模拟考试一点通将天津市安全员C证模拟考试试题进行汇编&#xff0c;组成一套天津市安全员C证全真模拟考试试题&#xff0c;学员可通过…

链表快慢指针合集(力扣)

876. 链表的中间结点 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x…

C++提高笔记(五)---STL容器(set/multiset、map/multimap)

1、set / multiset容器 1.1set基本概念 简介&#xff1a;所有元素都会在插入时自动被排序 本质&#xff1a;set和multiset属于关联式容器&#xff0c;底层结构是用二叉树实现 set和multiset区别&#xff1a; set不允许容器中有重复的元素 multiset允许容器中有重复的元素 …

uniapp——第2篇:编写vue语法

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;还有一定要会Vue!&#xff08;Vue2\Vue3&#xff09;都要会&#xff01;&#xff01;&#xff01;不然不好懂 一、去哪写&#xff1f; 就在【pages】的你的人一个页面文件夹里的【.vue】文…

多站合一的音乐搜索下载助手PHP源码l亲测

源码获取方式 回复&#xff1a;031601 搭建教程&#xff1a; 将源码下载上传至宝塔面板&#xff0c;直接运行即可~ 说明&#xff1a; 该源码进行测试&#xff0c;测试成功源码无加密优化相关其他采集问题。

langchain+chatglm3+BGE+Faiss Linux环境安装依赖

前言 本篇默认读者已经看过之前windows版本&#xff0c;代码就不赘述&#xff0c;本次讲述是linux环境配置 超短代码实现&#xff01;&#xff01;基于langchainchatglm3BGEFaiss创建拥有自己知识库的大语言模型(准智能体)本人python版本3.11.0&#xff08;windows环境篇&…