当前位置: 首页 > news >正文

protobuf序列化

文章目录

  • protubuf
    • protobuf序列化
    • protobuf的原理
    • 定义message
    • 编译message文件
    • 应用protobuf
      • Message 基本用法
      • Message 嵌套使用

protubuf

protobuf序列化

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

protobuf的原理

在这里插入图片描述

定义message

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

  • required:必须填

发送的数据

在这里插入图片描述

bike.proto

syntax = "proto2"; // 使用的版本package tutorial; // 生成一个包把类放进去// 申请短信请求
message mobile_request
{required string mobile = 1; // 按顺序写编号
}

编译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两个文件。
在这里插入图片描述

应用protobuf

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

  • API说明 : API说明

  • 编译生成的c++文件 -lprotobuf(链接库)

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

Message 基本用法

模拟客户端组包发送后,服务端拆包解析数据

mian.cc

执行结果
在这里插入图片描述

  • 从结果可以看出,手机号为11位,但是序列化后的数据为13位,则多添加了两位数据,分别是:标识号,字节长度。验证了上方protobuf的原理图。

源码:

#include <iostream>
#include <string>
#include "bike.pb.h"using namespace std;
using namespace tutorial; // 写上包的名称int main(void)
{std::string data; // 存储序列化的消息// 客户端发送请求{// 客户端发送手机号码mobile_request mr;mr.set_mobile("18684518289");mr.SerializeToString(&data); // 把序列化后的数据放入data中cout << "序列化后的数据[" << data.length() << "]: " << data << endl;cout << "标识号为:" << (int)(*data.c_str()) << endl;cout << "字节长度为:" << (int)(*(data.c_str() + 1)) << endl;// 客户端发送data  send(sockfd, data.c_str(), data.length());}cout<<"-------------------------"<<endl;// 服务器端接受请求{// receive(sockfd, data, ...);//  服务器解析数据mobile_request mr;mr.ParseFromString(data);cout << "客户端手机号码: " << mr.mobile() << endl;}return 0;
}

Message 嵌套使用

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

  • optional:可选的
  • repeated:可重复的 , 相当于可以一个数组

发送的数据

在这里插入图片描述

bike.proto

syntax = "proto2"; // 使用的版本package tutorial; // 生成一个包把类放进去// 成员变量依次赋值1,2,3,4,5,6,......// 充值查询响应
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; // 记录发生时的时间戳}// 表示内部有3个可重复记录repeated account_record records = 3;
}

main.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_recordlist_account_records_response_account_record *ar = larr.add_records(); // 增加一个account_record对象ar->set_type(0);ar->set_limit(i * 100);ar->set_timestamp(time(NULL));}printf("client recoreds size : %d\n", larr.records_size());larr.SerializeToString(&data);// 组包// 客户端发送data  send(sockfd, data.c_str(), data.length());}// 服务器端接受请求{//receive(sockfd, data, ...);list_account_records_response larr;larr.ParseFromString(data);// 拆包printf("sever 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());}}return 0;
}

相关文章:

protobuf序列化

文章目录protubufprotobuf序列化protobuf的原理定义message编译message文件应用protobufMessage 基本用法Message 嵌套使用protubuf protobuf序列化 protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式&#xff0c;性能比json和xml真的强很多&#xff…...

更新时无冲突的情况(阁瑞钛伦特软件-九耶实训)

大多数使用“与资源库同步”菜单的目的是想查看本地和远程资源的差异&#xff0c;并不想将本地的内容进行更新。 而“更新”菜单则不然&#xff0c;它的主要作用是将远程仓库中的内容下载到本地&#xff0c;以使本地的版本内容和仓库中的内容一致。 Step01&#xff1a;复用前…...

3.4 函数的单调性和曲线的凹凸性

学习目标&#xff1a; 如果我要学习函数的单调性和曲线的凹凸性&#xff0c;我会采取以下几个步骤&#xff1a; 理解概念和定义&#xff1a;首先&#xff0c;我会学习单调性和凹凸性的定义和概念。单调性是指函数的增减性质&#xff0c;可以分为单调递增和单调递减&#xff1b…...

LeetCode 404. 左叶子之和 | C++语言版

LeetCode 404. 左叶子之和 | C语言版LeetCode 404. 左叶子之和题目描述解题思路思路一&#xff1a;使用递归代码实现运行结果参考文章&#xff1a;思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a;LeetCode 404. 左叶子之和 题目描述 题目地址&#xf…...

arm架构安装Rancher并导入k8s集群解决Error: no objects passed to apply

Rancher介绍 Rancher 2.0-2.4版本 是一个开源的企业级容器管理平台。通过Rancher&#xff0c;企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。 Rancher 2.5版本 是为使用容…...

安装PaddleSpeech

github地址https://github.com/PaddlePaddle/PaddleSpeech 创建虚拟环境 conda create -p E:\Python\envs\nlppaddle python3.7 # conda create -p E:\Python\envs\speechstu python3.8激活虚拟环境 conda activate E:\Python\envs\nlppaddle # conda activate E:\Python\…...

UE “体积”的简单介绍

目录 一、阻挡体积 二、摄像机阻挡体积 三、销毁Z体积 四、后期处理体积 一、阻挡体积 你可以在静态网格体上使用阻挡体积替代碰撞表面&#xff0c;比如建筑物墙壁。这可以增强场景的可预测性&#xff0c;因为物理对象不会与地面和墙壁上的凸起细节相互作用。它还能降低物理模…...

微信 JAVA SDK 封装

weixin-popular 微信 JAVA SDK&#xff0c;是微信平台&#xff08;公众平台、开放平台、商户平台、服务商平台&#xff09;接口服务的JAVA 实现&#xff0c;开发 严格按照官方技术文档&#xff0c;合理划分包名、定义字段及方法&#xff0c;能胜任任何微信相关的业务。 使用建…...

上海智慧校园视频智能分析算法 yolov7

上海智慧校园视频智能分析算法通过yolov7python网络模型分析技术&#xff0c;上海智慧校园视频智能分析算法对校园内学生打架、翻墙、倒地、异常聚集、攀高等行为实时监测预警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研究团队希望它能够同时支持移动 GP…...

【树】你真的会二叉树了嘛? --二叉树LeetCode专题

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数

本期给大家带来的是是《LeetCode 热题 HOT 100》第四题——寻找两个正序数组的中位数的题目讲解&#xff01;&#xff01;&#xff01;&#xff08;&#xff09; 本文目录 &#x1f4a5;题意分析 &#x1f4a5;解题思路&#xff1a; 1、直接法 &#xff08;❌&#xff09; …...

Unity- 游戏结束以及重启游戏

文章目录游戏结束以及重启游戏建个游戏结束页面编写委托类 游戏主角 以及 ui管理类的脚本重启游戏游戏结束以及重启游戏 思路&#xff1a;利用Canvas创建好覆盖全屏的结束页面&#xff0c;默认关闭。游戏结束时&#xff0c;玩家控制的对象发起委托&#xff0c;ui管理收下委托&…...

NGK BeCu8·11铜合金板材

NGK BeCu811铜合金板材 CB498K、CuSn6Zn4Pb2-B、CC498K、CuSn6Zn4Pb2-C CB494K、CuSn5Pb9-B、CC494K、CuSn5Pb9-C CB495K、CuSn10Pb10-B、CC495K、CuSn10Pb10-C CB496K、CuSn7Pb15-B、CC496K、CuSn7Pb15-C CB497K、CuSn5Pb20-B、CC497K、CuSn5Pb20-C 日本古河连接器专用材料如:…...

电脑突然死机怎么办?正确做法在这!

案例&#xff1a;电脑突然死机怎么办&#xff1f; 【家人们&#xff0c;我刚刚正在做工作报告&#xff0c;突然间电脑就死机了&#xff0c;这可怎么办啊&#xff1f;有什么方法可以快速解决这个问题吗&#xff1f;急急急&#xff01;】 电脑在使用过程中&#xff0c;有时会出…...

基于cell数组的MATLAB仿真(附上完整仿真源码)

MATLAB是一款强大的数学软件&#xff0c;它提供了许多数据结构来存储和处理数据。其中&#xff0c;cell数组是一种非常有用的数据结构&#xff0c;它允许在一个数组中存储不同类型的数据&#xff0c;包括数值、字符串、逻辑值和其他cell数组等。 文章目录简单代码完整仿真源码下…...

电脑蓝屏问题排查

最近电脑安装了最新win10&#xff0c;更新最新的驱动以后&#xff0c;开机几分钟后&#xff0c;会蓝屏重启&#xff0c;报错为&#xff1a; DRIVER_POWER_STATE_FAILURE 下载蓝屏分析工具BlueScreenView 问题出在ntoskrnl.exe bing搜索给出了二种解决方案&#xff1a; 1&a…...

SpringBoot配置slf4j + logback

文章目录日志体系结构在SpringBoot中使用slf4j logback日志框架四种常用的日志输出1. ConsoleAppender2. FileAppender3. RollingFileAppender之TimeBasedRollingPolicy4. RollingFileAppender之SizeAndTimeBasedRollingPolicy日志过滤1. 级别介绍2. 过滤节点filter介绍Spring…...

JAVA——网络编程基本概念

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…...

[JavaEE]----Spring02

文章目录Spring_day021&#xff0c;IOC/DI配置管理第三方bean1.1 案例:数据源对象管理1.1.1 环境准备1.1.2 思路分析1.1.3 实现Druid管理步骤1:导入druid的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序1.1.4 实现C3P0管理步骤1:导入C3P0的依赖步…...

笔记本可自行更换CPU、独显了,老外用它手搓了台“PS5”

前面说到微软打算在 Win12 出来前搞出个模块化的Windows&#xff1a;下一个系统不是Win12&#xff0c;微软要复活Win10X。 模块化不用小蝾再过多介绍了&#xff0c;就像积木一样拼在一起组成一个整体。 优势就很明显了&#xff0c;由于每个部分都是单独的模块&#xff0c;更新…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...