| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 搜狗workflow——C++并行计算与异步网络引擎 序列化与反序列化 代码分析(一) -> 正文阅读 |
|
[网络协议]搜狗workflow——C++并行计算与异步网络引擎 序列化与反序列化 代码分析(一) |
2021SC@SDUSC 目录 一. 简单介绍序列化与反序列化? ? ? ? ? ?对象的序列化(Serialization),即把一个对象以流的方式,写入到文件中保存,叫写对象,也叫对象序列化,对象中包含的不仅仅是字符,使用字节流。 ? ? ? ?对象的反序列化(deserailization),即把文件中保存的对象,以流的方式读取出来,叫做读取对象,也叫对象的反序列。读取的文件保存的都是字节,使用字节流。 对象序列化的作用:在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。 ? ? ? ?在翻看其它文章时发现底下有个评论很棒,概括得很全面:序列化是指把一个对象变成二进制内容,本质上就是一个byte[]数组。 为什么要把对象序列化呢?因为序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传输到远程,这样,就相当于把对象存储到文件或者通过网络传输出去了。 有序列化,就有反序列化,即把一个二进制内容(也就是byte[]数组)变回对象。有了反序列化,保存到文件中的byte[]数组又可以“变回对象,或者从网络上读取byte[]并把它“变回”对象。 ? 二.协议与序列化的关系关于协议:需要在发送请求的时候定一个边界,在请求收到的时候按照这个设定的边界进行数据分割,避免语义不一致的事情发生,而这个边界语义的表达,就是所谓的协议。 协议层是凌驾于序列化层之上的一层。协议层和序列化层之间还有传输层,动态代理层。 protocol 层主要用于配置 refer(发现服务) 和 exporter(暴露服务) 的实现方式,transport 层定义了传输的方式,codec 层诠释了具体传输过程中报文解析的方式,serialize 层负责将对象转换成字节,以用于传输,proxy 层负责将这些细节屏蔽。 ? ? 用户自定义协议,需要提供协议的协议的序列化和反序列化方法。 三.关于workflow的序列化接口实现序列化的方案有很多,如JSON/XML,众多的序列化方案中,按照存储方案,可分为字符串存储和二进制存储,字符串存储是可读的,但是由于以上问题,这里只考虑二进制存储。二进制存储中可分为需要IDL和不需要IDL,或分为自描述与非自描述(反序列化是否需要IDL)。 workflow采取的是IDL序列化: 需要IDL的使用过程
在workflow中,?在ProtocolMessage.h里,序列化反序列化接口如下: namespace protocol { class ProtocolMessage : public CommMessageOut, public, CommMessageIn { private: virtual int encode(struct iovec vectors[], int max) = 0;//encode函数为序列化函数 virtual int append(const char *buf, size_t size) = 0;//append函数为反序列化函数 ... }; } 在上述接口中定义了两个函数,其中encode函数为序列化函数,append函数为反序列化函数。 encode函数:
扩展知识:IO流程中的io向量:iovec 为了提高从磁盘读取数据到内存的效率,引入了IO向量机制,IO向量即struct iovec,主要在API接口在readv和writev中使用。 struct iovec成为IO向量,其结构如下; #include <sys/uio.h> struct iovec{ ????? void *iov_base; /* pointer to the start of buffer */ ????? size_t iov_len; /* size of buffer in bytes */ } 很明显,iov_base作为一个指针,用于记录buffer地址(一般为用户态地址),iov_len表示buffer的大小。 在用户态或内核态中使用时,一般均采用指针的形式:struct?iovec?*iov。当然一般也给出其元素的个数count。 append函数
errno的设置
------------------------------------------------------------------------ 参考文献:序列化和反序列化 - 知乎 (zhihu.com) (41条消息) 序列化和反序列化的详解_tree_ifconfig的博客-CSDN博客_序列化和反序列化 docs/tutorial-10-user_defined_protocol.md · 搜狗开源/workflow - Gitee.com |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/30 4:04:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |