【Protobuf】protobuf详细介绍

protobuf详细介绍

  • 一、前言
  • 二、Protobuf简介
    • 2.1、核心思想
    • 2.2、Protobuf是如何工作的?
    • 2.3、如何使用 Protoc 生成代码?
    • 2.4 入门命令

一、前言

在以往的项目中进行网络通信和数据交换的应用场景中,最经常使用的技术便是json或xml。随着JSON的灵活优势,越来越多的企业选择JSON作为数据交换的格式,目前JSON已经成为了业界的主流。JSON已经足够好用,且能满足相当大部分的场景。但是今天在介绍一个Google的力作protobuf作为数据交换格式。我们来看看。

二、Protobuf简介

官网地址:Protocol Buffers Documentation

Github地址:GitHub - protocolbuffers/protobuf: Protocol Buffers - Google’s data interchange format

Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的数据交换格式,它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式,Protobuf 具有更小的数据体积、更快的解析速度和更强的可扩展性。同时他是一种语言无关、平台无关、可扩展的序列化格式。它使开发人员能够在文件中定义结构化数据.proto,然后使用该文件生成可以从不同数据流写入和读取数据的源代码。

2.1、核心思想

Protobuf 核心思想是使用协议来定义数据的结构和编码方式。协议是一个文本文件,其中定义了消息的结构。消息由字段组成,每个字段都有一个名称、类型和可选的默认值。然后使用Protobuf提供的解码器生成对应代码,用于序列化和反序列化数据,由于Protobuf是基于二进制编码,因此可以跨语言使用。

Protobuf 支持以下数据类型:

基本类型:例如 int32、string、bool 等
复合类型:例如 message、enum 等

2.2、Protobuf是如何工作的?

Protobuf 使用二进制数据格式,与基于文本的格式相比,它更紧凑且读写速度更快。它还提供了接口定义语言(IDL),可以轻松定义要序列化的数据的结构。

Protobuf 文件使用文件扩展名保存.proto。该.proto文件以 Protobuf 的 IDL 格式编写,包含有关数据结构的所有信息。数据被建模为“消息”,即名称/值对组。以下是文件中简单 Protobuf 消息的示例.proto:

// 指定 Protobuf 版本为版本 3(最新版本)
syntax = "proto3";
 
// 指定protobuf包名,防止类名重复
package com.iot.protobuf;
 
// 生成的文件存放在哪个包下,对于新手来说,不指定生成到哪个目录下即可,不建议指定包(否则,可能让你怀疑人生)
// option java_package = "com.iot.protos";
 
// 生成的类名,如果没有指定,会根据文件名自动转驼峰来命名
option java_outer_classname = "StudentProto";
 
// 定义了一个Student类
message Student {
    // 后面的值(1、2、3、4等)作为序列化后的二进制编码中的字段的唯一标签
    // 因为 1-15比 16 会少一个字节,所以尽量使用 1-15 来指定常用字段。
    int32 id = 1;
    string name = 2;
    string email = 3;
    string address = 4;
}

示例中,客户消息包含四个字段:id、name、email和address。每个字段都有其类型指示,以及指示其是否为required、optional或 的标签repeated。

该.proto文件可以使用 Protoc(即 Protobuf 编译器)编译成多种编程语言。该编译器以开发人员指定的编程语言生成源代码。该源代码包括用于写入、读取和操作.proto文件中定义的消息类型的类和方法。

当有数据要存储或传输时,可以创建生成的类的实例并用您的数据填充它们。然后将这些实例序列化为二进制格式。读取数据时,二进制格式将反序列化回从.proto文件生成的类的实例。这使您可以轻松访问结构化数据。

Protobuf 生成的二进制数据格式是平台无关的,可用于在不同系统、应用程序或服务之间交换数据,即使它们是用不同的编程语言实现或在不同的平台上运行的。

2.3、如何使用 Protoc 生成代码?

上面定义好的.proto,可以使用Protobbuf编译器(Protoc)将文件编译成不同语言。

在这里插入图片描述
下载编译器(根据系统下载不同的编译器):https://github.com/protocolbuffers/protobuf/releases/tag/v26.1

在这里插入图片描述

2.4 入门命令


注意:编译文件即执行 protoc 命令的前提是 要在proto 文件所在目录。

命令格式:

protoc --java_out=Java文件输出目录 需要编译的proto文件

以下是我自己电脑(Windows11)上的编译过程:

编译成java语言:(需要编译的文件可以是多个,以空格隔开即可)

protoc --java_out=E:\PracticeProject\java-project\spring-boot-udp\udptest-master\src\main\java\com\example\zyz\udp\ Response.proto Student.proto

编译命令如下面的代码将.proto文件编译成 c++:(需要编译的文件可以是多个,以空格隔开即可)

protoc --cpp_out=E:\PracticeProject\java-project\spring-boot-udp\udptest-master\src\main\java\com\example\zyz\udp\ Response.proto Student.proto

如果上述命令没有报错即代表执行成功。如图所示:

在这里插入图片描述




本文完结!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用户中心 -- 插件使用 插件使用思路

易错注意点 1 5.1启动类 & 入口类 需保持一致 网址: 第一节课,用户管理--后端初始化,项目调通。二次翻工2-CSDN博客 一、 用户管理 框架 网址: 用户管理 --汇总 -- 明细-CSDN博客 1.2 更改路径,并生效 网址…

盘点那些你不知道的“痛”,柯桥俄语培训

首先我们来看一下болеть的五大含义: ①(чем 及无补语) 生病,患病 例: болеть тифом 害伤寒病 болеть воспалением лёгких 得肺炎 ②[只用第3人称] болит,болят 疼痛 例&am…

CDGA|数据治理新视角:清洗数据,让数据质量飞跃提升

在数据治理的新视角下,数据清洗不再是一个孤立的环节,而是与数据收集、存储、分析和应用紧密相连。它涉及到数据的全生命周期,从源头开始就对数据进行严格的把控。在数据收集阶段,通过设定合理的数据规范和校验机制,确…

DFS时间戳

时间戳 这就是树上查询问题 , 是求两个点有什么关系 让我们来看一下样例解释:注意字母旁边的数字就是时间戳, a在先序遍历(遍历顺序 : 左,右,根)是第一个进, 第十六个出…

#ESP32S3R8N8建立工程(VSCODE)点亮LED

1.参考文档 【立创ESP32S3R8N8】IDF入门手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g 2.建立工程 3.运行效果 4.更改配置 5.插播 之前配置的环境是有问题的,就算有自动检测也要仔细检查,必须严格按照以…

Linux内核广泛采用的侵入式数据结构设计

Linux内核广泛采用的侵入式数据结构设计恐怕很难应用到一般程序开发中。基本上是个高维十字链表,一个节点(struct)可以同时位于多个hash/list/tree中。我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪…

一键设置jdk环境脚本

自动化脚本 一、使用方法 创建一个txt文本,放在和jdk存放的同一目录下,复制粘贴进我的代码,利用全局替换,将jdk1.8,改成你自己的jdk包名字,再重新把这个文件保存为.vbs文件。然后运行就行了 MsgBox "Runing s…

邮件SMTP服务的性能怎么做优化?如何配置?

邮件SMTP服务的工作原理?邮件服务器发信的优势特点? 邮件SMTP服务作为信息传递的核心组件,其性能优化显得尤为关键。一个高效稳定的SMTP服务不仅能提升工作效率,还能保障信息安全。那么,邮件SMTP服务的性能怎么做优化…

Web漏扫工具OWASP ZAP安装与使用(非常详细)从零基础入门到精通,看完这一篇就够了。

本文仅用于安全学习使用!切勿非法用途。 一、OWASP ZAP简介 开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)是一个组织,它提供有关计算机和互联网应用程序的公正、实际、有成本效益的信息。…

MySQL数据库基础(数据库的基本操作、常用的数据类型、表的相关操作)

前言 今天我们将介绍数据库的基本操作、常用的数据类型、表的相关操作 一、数据库的基本操作 1.1 显示当前的数据库 操作代码 show databases;1.2 创建数据库 基本语法: 1. //创建数据库 create database examble;2. create database if not exists exist exa…

必应bing广告推广开户时间需要多久?

企业选择合适的平台进行广告投放成为了企业获取竞争优势的关键一步,必应Bing作为全球第二大搜索引擎,凭借其庞大的用户基础和精准的广告定位能力,成为了众多企业海外及国内市场推广的优选渠道。云衔科技以专业、高效的服务,成为企…

JMeter的下载安装与使用(Mac)

1、下载地址​​​​​​https://jmeter.apache.org/download_jmeter.cgi 2、下载Binaries 下的apache-jmeter5.5.tgz 3、解压 4、启动 在bin目录下打开终端,输入sh jmeter 出现jmeter首页界面,即为成功。 5、使用 5.1 语言选择 option选项卡&am…

新装电脑Flutter环境部署坑汇总(持续更新)

1.本地安装,安装fvm的坑 本人电脑使用windows ,安装fvm则一般使用choco安装,那么首先需要安装choco,打开powershell/或者cmd运行以下命令: Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager…

Mycat(二)读写分离(Mysql读写分离->MyCat读写分离)、安装JDK

文章目录 概述搭建 MySQL 数据库主从复制MySQL 主从复制原理主机配置(atguigu01)从机配置(atguigu02)主机、从机重启 MySQL 服务主机从机都关闭防火墙在主机上建立帐户并授权 slave在从机上配置需要复制的主机主机新建库、新建表、insert 记录,从机复制停止从服务复…

Linux基本指令(2)

目录 mv指令: cat: more指令: less指令: head指令: tail指令: mv指令: 说明: mv命令是move的缩写,可以用来移动文件或者文件改名(move(rename)files),是linux系统下…

LMDeploy 量化部署 LLM-VLM 实践 学习笔记

视频链接 https://www.bilibili.com/video/BV1tr421x75B/?vd_sourcea1ce254b4a97f9f687a83e661793cb2c 什么是模型部署 部署指的是已经开发好的大模型投入使用,要把模型部署到服务器或者移动端里,如何在有限的资源里加载大模型? 比如你好不…

2024年信息教育化与语言艺术国际学术会议(IACIELA 2024)

2024年信息教育化与语言艺术国际学术会议(IACIELA 2024) 2024 International Conference on Information Education and Language Art 一、【会议简介】 2024年信息教育化与语言艺术国际学术会议,将探讨教育与语言艺术的结合。 在当今的信息时代,语言艺术…

ElasticSearch批处理

在刚才的新增当中,我们是一次新增一条数据。那么如果你将来的数据库里有数千上万的数据,你一次新增一个,那得多麻烦。所以我们还要学习一下批量导入功能。 也就是说批量的把数据库的数据写入索引库。那这里的需求是,首先利用mybat…

C#基础|StringBuilder字符串如何高效处理。

哈喽,你好,我是雷工。 字符串处理在C#程序开发中是使用频率比较高的,但常规的字符串处理方式对内存占用比较多,为了优化内存,减少不必要的内存浪费,引入了StringBuilder类。 下面学习下StringBuilder类的使…

牛客NC99 多叉树的直径【较难 深度优先 Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/a77b4f3d84bf4a7891519ffee9376df3 思路 核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf. 就是普通dfs的同时算路径长度。时间: O(n), DFS一次 空间: O(n)参考答案Java impo…
最新文章