远程过程调用-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

相关文章

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生