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

2024-03-17 00:44

本文主要是介绍远程过程调用-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);
}

这篇关于远程过程调用-buttonrpc源码解析1-序列化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817291

相关文章

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图