Protobuf详解

news2024/11/19 19:40:59

文章目录

    • Protobuf是什么
      • 传输协议类比
    • Protobuf协议语法
    • Protobuf类型
    • Protobuf编译器
      • 下载
      • 配置环境变量
    • 编写一个入门程序

Java是绝大多数人最常用的编程语言,那么作为Java开发如何学习protobuf呢?
步骤如下:

1.下载并安装 Protocol Buffers 工具:您需要从官方网站下载并安装 Protocol Buffers 工具,以便使用其中的 protoc 编译器。
2.学习 Protocol Buffers 的基本概念:了解 Protocol Buffers 是什么以及其基本概念,例如消息、字段和枚举等。
3.编写 .proto 文件:您需要使用 Protocol Buffers 的语言描述文件编写 .proto 文件来定义您的数据结构。
4.使用 protoc 编译器生成代码:使用 protoc 编译器将 .proto 文件转换为所需语言的源代码。
5.在 Java 中使用 Protocol Buffers:您可以在 Java 应用程序中使用 Protocol Buffers 生成的源代码,以便轻松地序列化和反序列化数据。
6.深入了解 Protocol Buffers:继续学习 Protocol Buffers 的高级特性,如嵌套消息、扩展和自定义选项等。
7.实践应用:通过实际应用案例来巩固您对 Protocol Buffers 的理解,并使用其提供的优势简化您的代码。

Protobuf是什么

Protobuf为Protocal Buffers的简写,是谷歌公司发明的一种传输协议。其是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。grpc应该大家都没少听说,其使用的就是protobuf。
在这里插入图片描述
官网:https://protobuf.dev/

传输协议类比

1.Xml
XML (Extensible Markup Language) 是一种类似于 HTML 的标记语言,但是 XML 没有使用预定义的标记。 因此,您可以根据自己的设计需求定义专属于您的标记。 这是一种十分有用的可存储、可搜索和可共享的格式存储数据的方法。
2.Json
JSON(JavaScript Object Notation, JS对象标记) 是一种轻量级的数据交换格式。它是基于 ECMAScript 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

3.Protobuf
Protobuf(Google Protocol Buffers),官方文档对 protobuf 的定义:protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,可用于数据通信协议和数据存储等,它是 Google 提供的一个具有高效协议数据交换格式工具库,是一种灵活、高效和自动化机制的结构数据序列化方法。相比XML,有编码后体积更小,编解码速度更快的优势;相比于 Json,Protobuf 有更高的转化效率,时间效率和空间效率都是 JSON 的 3-5 倍。

Protobuf协议语法

在这里插入图片描述

消息字段的修饰符
在这里插入图片描述

Protobuf类型

灵活长度int类型:int32, int64, uint32, uint64, sint32, sint64, bool, enum

64位固定长度类型:fixed64, sfixed64, double

可不定长度类型:string, bytes, repeated, map<K,V>, 或者引用其他路径message包 

32位固定长度类型:fixed32, sfixed32, float

Protobuf编译器

下载

下载地址:https://github.com/protocolbuffers/protobuf/releases,如windows下,则win后缀的版本,到解压目录的protoc-xxx-win/bin/protoc.exe执行安装即可。
在这里插入图片描述

配置环境变量

配置环境变量即刻处处使用,选择环境变量->path->编辑->新建->将解压的bin目录路径放进去,然后确定应用。

使用指令验证:
protoc --version

在这里插入图片描述

编写一个入门程序

一般传输都是偏物联网或者聊天类的数据,所以我们模拟一个gps的对象

构建一个maven项目
pom加入:

<dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.21.12</version>
        </dependency>
    </dependencies>

结构如下,我们需要编写的是proto文件以及测试的java文件
在这里插入图片描述
编写步骤:

syntax = "proto3";

option java_package = "com.demo.protoimpl";

message gps_data {
  int64 id = 1;

  string terminalId = 2;

  string dataTime = 3;

  double lon = 4;

  double lat = 5;

  float speed = 6;

  int32 altitude = 7;

  int32 locType = 8;

  int32 gpsStatus = 9;

  float direction = 10;

  int32 satellite = 11;

}

在项目路径下执行指令,使用protoc编译:

protoc -I=src/main/resources/proto --java_out=src/main/java gps_data.proto

就自动生成
在这里插入图片描述
编写测试类:

public class TestGpsProtobuf {
    public static void main(String[] args) {

        System.out.println("===== 构建一个GPS模型开始 =====");

        GpsData.gps_data.Builder builder = GpsData.gps_data.newBuilder();
        builder.setAltitude(1);
        builder.setDataTime("2023-01-17 16:00:00");
        builder.setGpsStatus(1);
        builder.setLat(39.124);
        builder.setLon(120.116);
        builder.setDirection(50.2F);
        builder.setId(50L);

        GpsData.gps_data gpsData = builder.build();
        System.out.println(gpsData.toString());

        System.out.println("===== 构建GPS模型结束 =====");

        System.out.println("===== gps Byte 开始=====");
        GpsData.gps_data gd = null;

        try {
            gd =GpsData.gps_data.parseFrom(gpsData.toByteArray());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        System.out.println(String.valueOf(gd));

        System.out.println("===== 使用gps 反序列化生成对象结束 =====");

    }

}

结果:

===== 构建一个GPS模型开始 =====
id: 50
dataTime: "2023-01-17 16:00:00"
lon: 120.116
lat: 39.124
altitude: 1
gpsStatus: 1
direction: 50.2

===== 构建GPS模型结束 =====
===== gps Byte 开始=====
id: 50
dataTime: "2023-01-17 16:00:00"
lon: 120.116
lat: 39.124
altitude: 1
gpsStatus: 1
direction: 50.2

===== 使用gps 反序列化生成对象结束 =====

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

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

相关文章

Red Hat Enterprise Linux (RHEL) 9.2 (x86_64, aarch64) - 红帽企业 Linux 9.2 发布

Red Hat Enterprise Linux (RHEL) 9.2 (x86_64, aarch64) 红帽企业 Linux 9.2 请访问原文链接&#xff1a;https://sysin.org/blog/rhel-9/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 红帽企业 Linux 9 红帽企业 Linux 9.…

把握协作机器人智能、灵活、安全三大矩阵

原创 | 文 BFT机器人 引言 协作机器人是一种能够和人类工作在同一空间的机器人&#xff0c;能够协同完成任务&#xff0c;为制造业和其他领域提供了更高效和灵活的解决方案。 目前&#xff0c;协作机器人市场正在迅速增长&#xff0c;因为越来越多的制造业和其他领域需要自动化…

PCIE使用的有效的命令

查看偏移内容 setpci --dumpregs capabilities查看 pci标准配置头空间 -x pci capbility配置空间 -xxx pcie扩展配置空间-xxxx 红色框框中的第一列对应具体的偏移&#xff0c;第二列对应的是设备的capability id, 第三列对应的是next capability id的偏移。 cap解释 在PCIe规…

电动车仪表盘语音芯片,带有数码管驱动多功能语音ic,WTV380-32N

为何要在电动车仪表盘上加入语音芯片&#xff1f; 电动车的驾驶过程中&#xff0c;驾驶员需要时刻关注车辆的状态和行驶信息&#xff0c;如电量、速度、里程等。这些信息如果以语音提示的方式进行播报&#xff0c;可以让驾驶员更加方便快捷地获取车辆状态&#xff0c;并且避免…

算法加密与解密、字符集、编码方式

加密算法 加密保证数据不会被窃取或者修改 不可逆加密算法 哈希算法 压缩映射&#xff1a;散列又称为哈希&#xff0c;是把任意长度的输入通过散列算法变换成固定长度的输出&#xff0c;该输出就是散列值。 哈希算法&#xff08;Hash&#xff09;又称摘要算法&#xff08;D…

相比欧美国家,国内开发软件外包项目的优势

软件开发在全球都有需求&#xff0c;尤其是欧美发达国家&#xff0c;不管是什么样的技术革命都离不开计算机软件的配套开发。另一方面欧美国家技术人员少且成本也比较高&#xff0c;相应的国内技术人员多而且技术全面&#xff0c;成本也低&#xff0c; 因此在国内找软件外包开发…

Hello, Mojo——首次体验Mojo语言

Hello, Mojo——首次体验Mojo语言 文章目录 Hello, Mojo——首次体验Mojo语言一、前言二、Mojo有哪些独特的功能使它不同于Python&#xff1f;三、可以在 Mojo 中导入和使用的 Python 哪些包&#xff1f;四、为什么参数化在 Mojo 中对于使用 SIMD 类型和硬件加速器很重要&#…

PowerShell install 一键部署TortoiseSVN

TortoiseSVN TortoiseSVN是 Subversion 版本控制系统的一个免费开源客户端&#xff0c;可以超越时间的管理文件和目录。文件保存在中央版本库&#xff0c;除了能记住文件和目录的每次修改以外&#xff0c;版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本&#x…

玩机搞机--定制系统 编译系统选项 隐藏设置 关闭app联网 增加设置选项【一】

在接待一些定制rom的过程中。对于有些客户的有些要求作出对应的系统编译操作选项。例如 增减手机设置中的某些选项。 &#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&am…

Druid 任意文件读取 (CVE-2021-36749)

漏洞原理 在Apache Druid系统中&#xff0c;InputSource用于从某个数据源读取数据。由于没有对用户可控的HTTP InputSource做限制&#xff0c;ApacheDruid 允许经过身份验证的用户以Druid服务器进程的权限从指定数据源读取数据&#xff0c;包括本地文件系统。攻击者可通过将文…

银河麒麟系统Arm64 编译Gdal

银河麒麟系统Arm64 编译Gdal GDAL 官网下载版本&#xff1b;我这边下载的是2.4.2 Download — GDAL documentation 拷贝到麒麟用户目录下&#xff1b;并解压 打开命令行&#xff1b;输入 make -j4 四线程编译 编译完成后输入 make install 完成后&#xff1b;此时的gdal.so会自…

windows系统下利用Nginx搭建rtmp流媒体服务器

windows系统利用Nginx搭建rtmp流媒体服务器 目录 windows系统利用Nginx搭建rtmp流媒体服务器1、介绍2、安装部署nginx3、安装部署ffmpeg实现推拉流 1、介绍 Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;并且支持rtmp&#xff0c;不过rtmp是作为一个nginx的一个模块…

DeepLab v3

Rethinking Atrous Convolution for Semantic Image Segmentation Chen L C, Papandreou G, Schroff F, et al. Rethinking atrous convolution for semantic image segmentation[J]. arXiv preprint arXiv:1706.05587, 2017. 重新思考空洞卷积用于语义图像分割 摘要 在本工作…

MySQL视图详解

我写本文主要目的&#xff0c;是在网上看见了 所以&#xff0c;文本主要探讨的问题如下&#xff0c;验证结果在最后面 一、修改视图&#xff0c;基表会跟着改吗&#xff1f;答案&#xff1a;会改变 二、修改基表&#xff0c;视图会变化吗&#xff1f;答案&#xff1a;会改变 …

AI孙燕姿项目实现

最近在b站刷到很多关于ai孙笑川唱的歌曲&#xff0c;加上最近大火的ai孙燕姿&#xff0c; 这下“冷门歌手”整成热门歌手了 于是写下一篇文章&#xff0c; 如何实现属于的ai歌手。 注意滥用ai&#xff0c;侵犯他人的名誉是要承担法律责任的 下面是一些所需的文件链接&#xff…

教你轻松玩转-ChatGPT或生成类大模型--助你成为未来高端黄金职业人

文章目录 1、前言2、大模型--巴拉巴拉小魔仙3、巴拉巴拉小魔仙-指导方向3、二次元美女或科幻图-魔法4、Cosplay-魔法5、魔法师5.1、系统消息5.2、小样本学习5.3、非对话场景5.4、使用明确的指令5.5、最后重复一遍指令5.5、对输出的操作5.6、添加语法5.7、把任务分解5.8、思维链…

如何开发网上独立商城?

互联网快速发展时代&#xff0c;越来越多的商家选择搭建自己的网上独立商城。网上独立商城是指一种完全独立于第三方平台的电子商务网站&#xff0c;可以帮助企业拥有更多的自主权&#xff0c;提高品牌影响力&#xff0c;降低营销成本&#xff0c;并且可以拥有更多的数据分析和…

java爬虫如何使用代理

在Java程序中使用代理是爬取网站数据的常见技术之一。代理服务器允许你通过它来访问某个网站&#xff0c;从而让你可以隐藏自己的真实IP地址或者规避一些地理限制等问题。 本文章将介绍如何使用Java实现网络爬虫代理。我们首先将介绍Java提供的代理相关类和方法&#xff0c;然…

详解C++类对象(中篇)——超详细

目录 前言&#xff1a;类的6个默认成员函数 一&#xff0c; 构造函数 1. 概念 2. 特性 二&#xff0c; 析构函数 2.1 概念 2.2 特性 2.3 牛刀小试 三&#xff0c; 拷贝构造函数 3.1概念 3. 2 特点 四&#xff0c; 赋值运算符重载 4. 1 运算符重载 五&#xff0…

【Redis高级应用】最佳实践

文章目录 Redis键值设计优雅的key结构拒绝BigKeyBigKey的危害如何发现BigKey如何删除BigKey 恰当的数据类型总结 批处理优化Pipeline我们的客户端与redis服务器是这样交互的MSetPipeline 集群下的批处理串行化执行代码实践 服务器端优化-持久化配置服务器端优化-慢查询优化什么…