手写RPC——数据序列化工具protobuf

手写RPC------数据序列化工具protobuf

Protocol Buffers(protobuf)是一种用于结构化数据序列化的开源库和协议。下面是 protobuf 的一些优点和缺点:

优点:

  • 高效的序列化和反序列化:protobuf 使用二进制编码,相比于文本格式(如 JSON 或 XML),具有更高的序列化和反序列化性能。它使用紧凑的二进制格式,节省了存储空间和网络带宽。

  • 小巧的消息体积:protobuf的编码格式非常紧凑,消息体积较小。这对于需要在网络上传输大量数据或存储大量数据的场景非常有利,减少了存储和传输的成本。

  • 跨语言支持:protobuf 支持多种编程语言,包括 C++, Java, Python, Go 等,使得不同语言的应用程序能够相互通信和交换数据。protobuf 提供了自动生成的代码,使得在不同语言之间进行数据传输更加方便。

  • 可扩展性:protobuf 的消息格式是可扩展的,允许向已有的消息类型添加新的字段或修改现有字段,而不会破坏向后兼容性。这使得在数据模型发生变化时,能够平滑地升级和演化。

  • 易于维护和更新:由于 protobuf 使用 IDL(接口定义语言)来定义消息格式,使得代码的维护和更新更加容易。只需更新 IDL 文件,并重新生成代码,就能够同步更新所有相关的代码。

缺点:

  • 不适合人类可读:protobuf 使用二进制编码,不像 JSON 或 XML 那样易于人类可读和调试。这对于调试和开发过程中的可视化和人类可读性要求较高的场景可能不够友好。

  • 需要预先定义消息格式:protobuf 要求在使用之前,需要先定义消息格式,并生成对应的代码。这增加了一些额外的步骤和工作量,相比于一些动态的数据格式,如 JSON,可能稍显繁琐。

  • 不支持动态架构:protobuf 的消息格式在定义后是静态的,不支持在运行时动态地修改和扩展消息。如果需要在运行时根据需要动态地修改数据结构,protobuf可能不是最佳选择。

总体而言,protobuf 是一种高效、跨语言和可扩展的数据序列化和通信协议,适用于对数据大小和性能要求较高的场景。它在分布式系统、网络通信和存储等领域得到广泛应用。然而,根据具体的使用场景和需求,仍需综合考虑其优点和缺点,选择合适的数据格式和通信协议。

安装protobuf

这里以ubuntu为例子

sudo apt install  libprotobuf-dev

使用

定义一个rpc.proto文件

syntax = "proto3";
package rpc;
message AddRequest {
  int32 x = 1;
  int32 y = 2;
}

message AddResponse {
  int32 result = 1;
}

采用下面的指令转换为C++代码

protoc --cpp_out=. rpc.proto

一个简单的使用例子

#include <iostream>
#include <string>
#include "rpc.pb.h"

using namespace std;
using rpc::AddRequest;
using rpc::AddResponse;

int main() {

    // 构建请求消息
    AddRequest request;
    request.set_x(5);
    request.set_y(3);
    
    // 将消息进行序列化成字符串存储至requestStr
    string requestStr;
    request.SerializeToString(&requestStr);
  
    //对字符串进行解析
    AddRequest req;
    req.ParseFromString(requestStr);
    
    AddResponse response;
    response.set_result(request.x() + request.y());
    cout<<"result:"<<response.result()<<endl;
    
  return 0;
}

输出结果如下:

可见我的github仓库:https://github.com/mulinhu/CPPer/tree/main/network_demo/proto_demo

相关推荐
7yewh41 分钟前
【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)
c语言·数据结构·c++·算法·leetcode·哈希算法·散列表
白鹭float.3 小时前
【OpenGL/C++】面向对象扩展——测试环境
c++·图形学·opengl
小wanga3 小时前
【C++】类型转换
jvm·c++
我不是程序猿儿3 小时前
【C++】xml烧录 调用twinCat流程自动化
xml·c++·自动化
小酒丸子4 小时前
基于QT和C++的实时日期和时间显示
c++·qt
弓.长.4 小时前
【leetcode刷题】:双指针篇(有效三角形的个数、和为s的两个数)
c++·算法·leetcode
thisiszdy5 小时前
<C++> XlsxWriter写EXCEL
c++·excel
14_115 小时前
Cherno C++学习笔记 P51 创建并使用库
c++·笔记·学习
就叫飞六吧7 小时前
51 单片机和 STM32 引脚命名对照表与解析
c++·stm32·单片机·嵌入式硬件·51单片机
霜雪殇璃7 小时前
c++对结构体的扩充以及类的介绍
开发语言·c++·笔记·学习