Google Protocol Buffers快速入门指南

声明:未经作者允许,禁止转载。

概念

Portocol Buffer是谷歌提出来的一种序列化结构数据的机制,它的可扩展性特别强,支持C++、C#、Java、Go和Python等主流编程语言。使用Portocol Buffer时,仅需要定义好数据的结构化方式,然后就可以使用编译生成的源代码在各种语言各种数据流中写入和读取该结构化数据。

Protocol Buffer的安装

打开Protocol Buffer的Github地址,选择适合自己系统的版本。例如对于windows系统,可以下载protoc-28.2-win64.zip,并放置于合适的位置,之后进入bin目录,可以看到protoc.exe,将其所在的目录到环境变量中。

然后打开命令行,输入protoc,若看到如下界面说明安装成功。

protoc-command

使用Protocol Buffer

本节主要介绍Portocol Buffer关于Java的使用案例,其步骤大致为:

  • .proto文件中定义消息格式;
  • 使用Protocol buffer编译器编译.proto文件;
  • 使用Java API进行消息的读写。

消息的定义

对于要序列化的数据结构,需要在.proto文件中定义相应的消息格式。

syntax = "proto3"; // 使用proto3语法option java_package = "com.test.protobuf";
option java_outer_classname = "PersonBuf";message Person{string name = 1;int32 age = 2;string id = 3;
}

.proto文件中支持类似C/C++中的///*...*/两种注释。

字段说明

在定义域(字段)时,必须为每个定义的字段分配一个在 [ 1 , 536 , 870 , 911 ] [1,536,870,911] [1,536,870,911]的数字,但需要注意的是:

  • 消息中不同字段分配的数字必须唯一;
  • 数字范围 [ 19 , 000 , 19 , 999 ] [19,000, 19,999] [19,000,19,999]是Protocol Buffer预留的,使用该范围内的保留字段编号会报错;

标量类型

.proto支持的常用标量类型包括:

.proto类型C++类型Java类型
doubledoubledouble
floatfloatfloat
int32int32int
int64int64long
boolboolboolean
stringstringString

可选项

.proto文件中一些常用的可选项包括:

  • java_package:常用于Java 或 Kotlin代码,用于指定生成的Java类的包名,帮助组织代码;
  • java_outer_classname:指定生成的外部类的名称。默认情况下,Protobuf会根据文件名生成外部类名;
  • java_multiple_files:控制是否为每个消息生成独立的Java文件。如果设置为true,每个消息会被生成到单独的文件中。

编译.Proto文件

当编译.proto文件时,编译器会生成你所选择的语言的代码。生成的代码将被用于处理自定义的消息类型,包括获取和设置字段值、序列化和反序列化。

以Java语言为例,编译器为每种消息类型生成一个 .java 文件,并为创建消息类实例提供了一个特殊的 Builder 类。

protoc --java_out=DST_DIR Person.proto

--java_out用于指定生成的Java文件的输出目录

Java程序中应用

在使用需要在pom.xml中添加Protobuf相关的依赖:

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

若要构造消息,首先需要构造一个builder,并设置想要设置的任何字段为自定义的值,然后调用构造器的build()方法。

PersonBuf.Person person = PersonBuf.Person.newBuilder().setName("Java").setId("1001").setAge(18).build();
System.out.println(person.isInitialized()); // 检查是否已设置所有必填字段
System.out.println(person.toString()); // 返回字符串格式的消息

解析和序列化

Protobuf关于解析和序列化的方法包括:

方法说明
byte[] toByteArray()序列化消息并返回字节数组
static Person parseFrom(byte[] data)从给定的字节数组解析消息
void writeTo(OutputStream output)序列化消息并将其写入OutputStream
static Person parseFrom(InputStream input)InputStream 读取并解析消息

其所对应的使用示例为:

// 序列化为字节数组
byte[] bytes = person.toByteArray();
PersonBuf.Person person1 = PersonBuf.Person.parseFrom(bytes);
System.out.println(person1.toString());// 序列化并保存
String filename = "src/main/files/Person.bin";
try(FileOutputStream outputStream = new FileOutputStream(filename)){person.writeTo(outputStream);
}catch (IOException e){e.printStackTrace();
}// 反序列化读取构造实例
try(FileInputStream inputStream = new FileInputStream(filename)){PersonBuf.Person person2 = PersonBuf.Person.parseFrom(inputStream);System.out.println(person2.toString());
}catch (IOException e){e.printStackTrace();
}

结语

参考资料

  • Protocol Buffers Documentation

以上便是本文的全部内容,若是觉得不错的话可以支持一下,你们的支持是博主继续更新的不竭动力。若发现任何错误,也敬请批评指正!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql梳理10——使用SQL99实现7中JOIN操作

10 使用SQL99实现7中JOIN操作 10.1 使用SQL99实现7中JOIN操作 本案例的数据库文件分享&#xff1a; 通过百度网盘分享的文件&#xff1a;atguigudb.sql 链接&#xff1a;https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd2233 提取码&#xff1a;2233 # 正中图 SEL…

每日OJ题_牛客_添加逗号_模拟_C++_Java

目录 牛客_添加逗号_模拟 题目解析 C代码1 C代码2 Java代码 牛客_添加逗号_模拟 添加逗号_牛客题霸_牛客网 题目解析 读取输入&#xff1a;读取一行字符串。分割字符串&#xff1a;使用空格将字符串分割成单词数组。拼接字符串&#xff1a;将单词数组中的每个单词用逗号…

Oracle控制文件全部丢失如何使用RMAN智能恢复?

1.手动删除所有控制文件模拟故障产生 2.此时启动数据库发现控制文件丢失 3.登录rman 4.列出故障 list failure; 5.让RMAN列举恢复建议 advise failure; 6.使用RMAN智能修复 repair failure;

Java常用三类定时器快速入手指南

文章目录 Java常用三类定时器快速入手指南一、序言二&#xff0c;Timer相关1、概念2、Timer类3、TimerTask类4、ScheduleExecutorService接口 三&#xff0c;Scheduled相关1、配置1.1 SpringMVC配置1.2 SpringBoot配置&#xff08;1&#xff09;单线程&#xff08;2&#xff09…

cpp,git,unity学习

c#中的? 1. 空值类型&#xff08;Nullable Types&#xff09; ? 可以用于值类型&#xff08;例如 int、bool 等&#xff09;&#xff0c;使它们可以接受 null。通常&#xff0c;值类型不能为 null&#xff0c;但是通过 ? 可以表示它们是可空的。 int? number null; // …

桥接(桥梁)模式

简介 桥接模式&#xff08;Bridge Pattern&#xff09;又叫作桥梁模式、接口&#xff08;Interface&#xff09;模式或柄体&#xff08;Handle and Body&#xff09;模式&#xff0c;指将抽象部分与具体实现部分分离&#xff0c;使它们都可以独立地变化&#xff0c;属于结构型…

【AAOS】CarService -- Android汽车服务

概述 Android Automative OS理解为Android OS + Android Automative Service,而CarService就是提供汽车相关功能的最主要模块。 CarService与Android OS的关系:CarService运行于独立的进程中,其作为原有Android服务的补充,在汽车设备上运行。CarService在整体车载通信中起…

JAVA线程基础二——锁的概述之乐观锁与悲观锁

乐观锁与悲观锁 乐观锁和悲观锁是在数据库中引入的名词,但是在并发包锁里面也引入了类似的思想&#xff0c;所以这里还是有必要讲解下。 悲观锁指对数据被外界修改持保守态度&#xff0c;认为数据很容易就会被其他线程修改&#xff0c;所以在数据被处理前先对数据进行加锁&…

python 如何引用变量

在字符串中引入变量有三种方法&#xff1a; 1、 连字符 name zhangsan print(my name is name) 结果为 my name is zhangsan 2、% 字符 name zhangsan age 25 price 4500.225 print(my name is %s%(name)) print(i am %d%(age) years old) print(my price is %f%(pric…

项目管理专业资质认证ICB 3中关于项目经理素质的标准

项目管理专业资质认证ICB 3中关于项目经理素质的标准&#xff0c;的确很全面&#xff0c;下面摘录之&#xff1a;

15年408计算机网络

第一题&#xff1a; 解析&#xff1a; 接收方使用POP3向邮件服务器读取邮件&#xff0c;使用的TCP连接&#xff0c;TCP向上层提供的是面向连接的&#xff0c;可靠的数据传输服务。 第二题&#xff1a; 解析&#xff1a;物理层-不归零编码和曼彻斯特编码 编码1&#xff1a;电平在…

LabVIEW项目编码器选择

在LabVIEW项目中&#xff0c;选择增量式&#xff08;Incremental Encoder&#xff09;和绝对式&#xff08;Absolute Encoder&#xff09;编码器取决于项目的具体需求。增量式编码器和绝对式编码器在工作原理、应用场景、精度和成本等方面存在显著差异。以下从多方面详细阐述两…

又一年国庆至,“打工人”在欢呼,OTA们在雀跃

国庆“黄金周”倒计时最后一天&#xff0c;旅游出行即将迎来新一轮高峰。 安信国际指出&#xff0c;国庆期间&#xff0c;出游人次的增长确定性高于人均消费的增长。预计国内旅游收入7,000-7,500亿元&#xff0c;较2019年同期增8%-15%&#xff1b;预计国内旅游人次8.5-9.0亿人…

今日指数项目A股大盘数据采集

1、A股大盘数据采集 1.1 A股大盘数据采集准备 1.1.1 配置ID生成器bean A股大盘数据采集入库时&#xff0c;主键ID保证唯一&#xff0c;所以在stock_job工程配置ID生成器&#xff1a; Configuration public class CommonConfig {/*** 配置基于雪花算法生成全局唯一id* 参与…

springboot+大数据+基于协同过滤算法的校园食堂订餐系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

Git常用方法——详解

一、下载安装git git官网&#xff1a; Git - Downloads (git-scm.com) 下载安装Git&#xff08;超详细超简单&#xff09;_git下载-CSDN博客 二、克隆下载至本地 1、复制HTTPS链接 在gitee或者gitLab或者gitHub上复制HTTPS链接 2、打开Open Git Bash here 在本地想要新建文…

闯关训练一:Linux基础

闯关任务&#xff1a;完成SSH连接与端口映射并运行hello_world.py 1.创建开发机 2.SSH连接 3. VS-Code 连接 选择 Linux 平台 &#xff0c;输入密码 &#xff0c;选择进入文件夹 4.端口映射 按照下文安装Docs pip install gradio 运行server.py import gradio as grdef …

工业制造场景中的设备管理深度解析

在工业制造的广阔领域中&#xff0c;设备管理涵盖多个关键方面&#xff0c;对企业的高效生产和稳定运营起着举足轻重的作用。 一、设备运行管理 1.设备状态监测 实时监控设备的运行状态是确保生产顺利进行的重要环节。通过传感器和数据采集系统等先进技术&#xff0c;获取设备…

新书速览|Stable Diffusion-ComfyUI AI绘画工作流解析

《Stable Diffusion-ComfyUI AI绘画工作流解析》 本书内容 《Stable Diffusion-ComfyUI AI绘画工作流解析》从零开始&#xff0c;详尽系统地讲解从本地部署ComfyUI、下载安装自定义节点&#xff0c;到搭建各种工作流程的全过程。同时&#xff0c;辅以3D形象转绘、艺术二维码和证…

思科dhcp的配置

以路由器为例 让pc3 自动获取ip地址并获取的网段为172.16.4.100-172.16.4.200 配置如下&#xff1a; R1(config)#interface GigabitEthernet0/2 R1(config)#ip address 172.16.4.254 255.255.255.0 R1(config)# no shutdown R1(config)#ip dhcp pool 4_pool //创建dhcp地址池…