手写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

相关推荐
m0_748240253 小时前
Windows编程+使用C++编写EXE加壳程序
开发语言·c++·windows
LoveXming4 小时前
Chapter14—中介者模式
c++·microsoft·设计模式·中介者模式·开闭原则
杨筱毅7 小时前
【C++】【常见面试题】最简版带大小和超时限制的LRU缓存实现
c++·面试
陌路208 小时前
C23构造函数与析构函数
开发语言·c++
_OP_CHEN9 小时前
C++进阶:(二)多态的深度解析
开发语言·c++·多态·抽象类·虚函数·多态的底层原理·多态面试题
金色熊族10 小时前
装饰器模式(c++版)
开发语言·c++·设计模式·装饰器模式
Dream it possible!11 小时前
LeetCode 面试经典 150_链表_旋转链表(64_61_C++_中等)
c++·leetcode·链表·面试
CS创新实验室13 小时前
典型算法题解:长度最小的子数组
数据结构·c++·算法·考研408
我有一些感想……13 小时前
浅谈 BSGS(Baby-Step Giant-Step 大步小步)算法
c++·算法·数论·离散对数·bsgs
j_xxx404_14 小时前
C++ STL:string类(3)|operations|string类模拟实现|附源码
开发语言·c++