protobuf序列化原理、安装与应用

news2025/1/17 0:14:09

目录

protobuf序列化

 protobuf的原理

 protobuf 的安装

编译message文件

应用protobuf


protobuf序列化

        protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式,性能比json和xml真的强很多,毕竟google出品。

        官网:https://developers.google.com/protocol-buffers/

 protobuf的原理

 protobuf 的安装

apt-get install autoconf automake libtool curl make g++ unzip
$ git clone https://github.com/google/protobuf.git 
$ cd protobuf 
$ git submodule update --init --recursive 
$ ./autogen.sh 
$ ./configure 
$ make 
$ make check 
$ sudo make install 
$ sudo ldconfig 

定义message

所有的message必须定义到一个文件中,且文件的后缀名为.proto。例如我们定义的bike.proto文件

syntax = "proto2";

package tutorial;

message mobile_request
{
    required string mobile = 1;
}

message mobile_response
{
    required int32 code   = 1;   //响应代号
    required int32 icode  = 2;   //验证码
    optional string data  = 3;   //失败原因
}


message login_request
{
    required string mobile  = 1;    // 手机号码
    required int32  icode   = 2;    // 验证码
}


message login_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
}

message recharge_request
{
    required string mobile  = 1;    // 手机号码
    required int32  amount  = 2;    // 充值金额
}


message recharge_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    required int32  balance = 3;    // 最新的余额
}

message account_balance_request
{
    required string mobile = 1;
}

message account_balance_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    required int32  balance = 3;
}

message list_account_records_request
{
    required string mobile = 1;
}

message list_account_records_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    message account_record
    {
        required int32  type      = 1; // 0 : 骑行消费,  1 : 充值, 2 : 退款
        required int32  limit     = 2; // 消费或者充值金额
        required uint64 timestamp = 3; // 记录发生时的时间戳
    }

    repeated account_record records = 3;
}

message list_travel_records_request
{
    required string mobile = 1;
}

message list_travel_records_response
{
    required int32   code   = 1;    // 响应代号
    optional string  desc   = 2;    // 验证码
    message travel_record
    {
        required uint64 stm      = 1;   // start timestamp
        required uint32 duration = 2;   // 骑行时长
        required uint32 amount   = 3;   // 所耗金额
    }

    required double              mileage   = 3; // 里程
    required double              discharge = 4; // 排放
    required double              calorie   = 5; // 卡路里
    repeated travel_record       records   = 6;
}

编译message文件

编译语法:

protoc -I=$SRC_DIR --cpp_out=$DST_DIR  bike.proto

SRC_DIR 表示proto文件所在的目录,cpp_out指定了生成的代码的路径, bike.proto指proto文件名。

protoc -I=./ --cpp_out=./ bike.proto

这样在当前目录生成了bike.pb.cc和bike.pb.h两个文件。

编译生成的c++文件 

g++  -std=c++11   example.cc bike.pb.cc -lprotobuf

应用protobuf

把生成了protocol.pb.cc和protocol.pb.h加入到工程,那么接着就是调用一些API,完成序列化和反序列化。

API说明  : https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message

  • Message 基本用法

范例1: example1.cc

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


using namespace std;
using namespace tutorial;


int main(void)
{
    std::string data;   //存储序列化的消息

    //客户端发送请求
    {
        mobile_request mr;
        mr.set_mobile("18684518289");

        mr.SerializeToString(&data);
        cout<<"序列化后的数据["<<data.length()<<"]: "<< data << endl;
        cout<<hex<<(int)*((char*)data.c_str())<<endl;
        cout<<hex<<(int)*((char*)data.c_str() + 1)<<endl;
        //客户端发送data  send(sockfd, data.c_str(), data.length());
    }
    //服务器端接受请求
    {
        //receive(sockfd, data, ...);
        mobile_request mr;
        mr.ParseFromString(data);
        cout<<"客户端手机号码: " << mr.mobile() << endl;

    }

    return 0;
}
  • Message 嵌套使用

范例2: example1.cc

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

using namespace std;
using namespace tutorial;


int main(void)
{
    std::string data;   //存储序列化的消息

    //客户端发送请求
    {
        list_account_records_response larr;
        larr.set_code(200);
        larr.set_desc("ok");

        for(int i=0; i<5; i++)
        {
            list_account_records_response_account_record * ar = larr.add_records();
            ar->set_type(0);
            ar->set_limit(i * 100);
            ar->set_timestamp(time(NULL));
        }

        printf("recoreds size : %d\n", larr.records_size());
        larr.SerializeToString(&data);
        //客户端发送data  send(sockfd, data.c_str(), data.length());
    }
    //服务器端接受请求
    {
        list_account_records_response larr;
        larr.ParseFromString(data);

        printf("recoreds size : %d\n", larr.records_size());
        printf("code: %d\n", larr.code());
        for(int i=0; i<larr.records_size(); i++)
        {
            const list_account_records_response_account_record &ar = larr.records(i);
            printf("limit: %d\n", ar.limit());
        }
        //cout<<"客户端手机号码: " << mr.mobile() << endl;
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言笔记 | 一元三次方程

文章目录 0x00 前言 0x01 问题分析 0x02 代码设计 0x03 完整代码 0x04 运行效果 0x05 参考文献 0x06 总结 0x00 前言 在 1545 年&#xff0c;意大利学者卡丹所写的《关于代数的大法》中&#xff0c;提出了一元三次方程的求根公式。人们将其称为卡丹公式。对于标准型的一…

Python 彩蛋 —— 开发人员留下的惊喜

Python 彩蛋 —— 开发人员留下的惊喜 简介&#xff1a;Python 核心程序开发人员在软件内部设计了2个彩蛋。一起来看看吧。 文章目录 Python 彩蛋 —— 开发人员留下的惊喜&#x1f4a1;彩蛋一&#xff1a;Python 之禅&#x1f4a1;彩蛋二&#xff1a;Python 有趣的漫画 &#…

程序员面试完之后,人麻了...

去面试吧 面不被录用的试 面hr为了完成任务的试 面一轮二轮没有下文试 面需要通勤2小时的试 面随时加班的试 ...... 今年的“金三银四”被网友们称为“铜三铁四”&#xff0c;招聘软件上的岗位都能背下来了&#xff0c;简历却依然石沉大海。 好不容易等来个回复&#xff…

南京邮电大学通达学院2023《电子装配实习》报告

南京邮电大学通达学院2023《电子装配实习》报告 一 声明二 题目/实习报告提示三 例答 红笺寄 休遣玉人知 ——赠nmy 一 声明 南京邮电大学通达学院2023《电子装配实习》报告 答案更新时间:2023.04.10&#xff0c;已更新完成&#xff0c;如无错误不在更新 由于作者解答能力有限…

计算带宽使用情况

由于大多数组织依靠其 IT 基础架构进行日常业务关键型运营&#xff0c;因此网络带宽可以对其网络性能产生巨大影响。连接不良可能会使组织花费大量资金并影响生产力。这就是为什么监控和计算带宽使用情况对于确保组织的最佳网络带宽性能至关重要的原因。 在计算企业的带宽使用…

Linux以非堵塞模式执行shell脚本

1. HOW 我们在linux系统的终端执行命令的时候&#xff0c;有些命令可以很快的执行完退出&#xff0c;我们就可以继续使用这个终端了 比如 ls 这个命令&#xff0c;它执行的很快&#xff0c;等他返回完结果之后&#xff0c;我们可以继续使用这个终端。 还有部分命令是不会立马…

算法——双指针技巧总结

算法——双指针技巧总结 一、双指针二、链表快慢指针19.删除链表的倒数第 N 个结点双指针 206.反转链表思路&#xff1a;双指针法递归法 92.反转链表 II1.递归2.迭代&#xff08;双指针头插法&#xff09; 876.链表的中间结点常规思路双指针思路 141.环形链表&#xff08;判断链…

【安全与风险】恶意软件:概念、攻击和检测

恶意软件:概念、攻击和检测 恶意软件的定义恶意软件的类型易损性如何防范恶意软件:终端用户的观点不足防病毒软件基于主机的恶意软件检测特征检测启发式检测 数据收集挑战沙箱分析蜜罐 恶意软件的定义 Malware一词是恶意软件的缩写。 恶意软件是任何以破坏设备、窃取数据为目…

Ubuntu Desktop 启用远程桌面(Vino和TigerVNC方式)

文章目录 前言使用Vino方式无显示器使用使用TigerVNC方式 前言 在很多领域的生产开发工作中常常需要用到 Ubuntu Desktop 系统&#xff0c;但是在一些日常的工作交流中又离不开Windows系统&#xff0c;这种时候比较常用的解决方案就是在Windows系统上使用虚拟机安装Ubuntu。不…

【广州华锐互动】AI高仿真数字人在企业服务中的应用

虚拟数字人是指利用人工智能技术和计算机图形学生成的高度逼真的虚拟人形象&#xff0c;它可以模拟人类的语言、情感、行为和外貌&#xff0c;从而成为一种强大的营销工具&#xff0c;可以为企业带来多种商业价值。 广州华锐互动作为一家15年虚拟现实内容制作商&#xff0c;已…

CSS背景,元素显示模式,盒模型

文章目录 颜色取值选择器进阶复合选择器后代选择器&#xff1a;空格子代选择器 并集选择器&#xff08;union selector&#xff09;交集选择器&#xff08;intersection selector&#xff09;emmet语法hover伪类选择器 背景相关背景颜色背景图片背景平铺图片位置背景相关连写im…

文字大小PointSize和PixelSize

无论PointSize&#xff08;点大小&#xff09;还是像素大小&#xff08;PixelSize&#xff09;&#xff0c;描述的都是文字在输出设备&#xff08;显示屏、打印机等&#xff09;上呈现的大小 首先理解两个概念&#xff1a;DPI&#xff08;Dots per Inch) 和 PPI&#xff08;Pix…

295-光纤数据收发 隔离卡 加速计算卡 基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡

基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡 一、板卡概述 板卡采用Xilinx公司的XC7K325T-2FFG900I芯片作为主处理器&#xff0c;可应用于万兆网络、高速数据采集、存储&#xff1b;光纤隔离网闸等领域。 二、功能和技术指标&#xff1a; 板卡功能 参…

背锅侠?软件测试各类bug分类定位,从功能到性能超细总结......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 遇到功能性问题&a…

【服务器数据恢复】NetApp存储中的oracle数据库数据恢复案例

服务器数据恢复环境&#xff1a; NetApp某型号存储&#xff0c;共96块SAS硬盘&#xff0c;划分的lun都映射给小型机使用&#xff0c;存放的是Oracle数据库文件&#xff0c;采用ASM裸设备存储方式。 服务器故障&#xff1a; 管理员误操作删除了该NetApp存储上的所有lun。具体情…

【Java】Java绘制UML图

1.继承关系&#xff08;Inheritance&#xff09; 继承指的是一个类&#xff08;子类、子接口&#xff09;继承另外的一个类&#xff08;父类、父接口&#xff09;的功能&#xff0c;通过关键字 extends 明确标识 UML图 继承用一条带空心三角箭头的实线表示&#xff0c;从子类…

数字孪生可实现三维可视化智慧园区吗?

随着城市化的进程和信息化的发展&#xff0c;越来越多的城市拥有了智慧园区这一新的城市形态&#xff0c;通过“互联网”和物联网技术&#xff0c;实现了各种功能部门之间的信息共享与协同&#xff0c;提高了园区服务的质量和效率。然而&#xff0c;如何更好地实现园区管理和运…

DNS服务的正反向解析

目录 1.DNS域名解析服务概括 产生原因 作用&#xff1a; 2.正向解析 2.1 准备工作&#xff0c;关闭selinux和防火墙 2.2 安装DNS软件 2.3 服务端操作&#xff0c;编辑DNS主配置文件 2.4 服务端操作&#xff0c;编辑区域配置文件&#xff0c;可以在最后添加&#xff0c…

OpenAI文档翻译——搭建第一个自己的ChatGPT应用

这篇主要是讲了重头到位创建一个基于OpenAI API的应用程序的过程&#xff0c;同时给出了Node.js、Python版本的实例代码。应用程序的构建总体来说是很简单的就是一个接口调用&#xff0c;前提是我们需要提供密匙。 如果想要获取更好的结果返回一个是可以给模型提供一些列子从而…

9.5 数组的指针和指向数组的指针变量-2

9.5 数组的指针和指向数组的指针变量-2 一.数组名作为函数参数&#xff08;1&#xff09;实参和形参都是数组名&#xff08;2&#xff09;实参用数组名&#xff0c;形参用指针变量&#xff08;3&#xff09;实参和形参都用指针变量&#xff0c;这个和&#xff08;2&#xff09;…