Google Protocol Buffers快速入门指南

server/2024/12/22 17:53:22/

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

概念

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()方法。

java">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 读取并解析消息

其所对应的使用示例为:

java">// 序列化为字节数组
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.ppmy.cn/server/124974.html

相关文章

【2025】基于Django的鱼类科普网站(源码+文档+调试+答疑)

文章目录 一、基于Django的鱼类科普网站-项目介绍二、基于Django的鱼类科普网站-开发环境三、基于Django的鱼类科普网站-系统展示四、基于Django的鱼类科普网站-代码展示五、基于Django的鱼类科普网站-项目文档展示六、基于Django的鱼类科普网站-项目总结 大家可以帮忙点赞、收…

【Axure高保真原型】标签分类管理

今天和大家分享标签分类管理的原型模板&#xff0c;效果包括&#xff1a; 点击树元件里的箭头可以展开或者收起子分类&#xff1b; 点击搜索按钮&#xff0c;输入内容后可以快速筛选分类节点&#xff1b; 点击选中分类节点&#xff0c;右侧显示对应的分类详情&#xff1b; 点…

C语言 18 条件编译

再来看看条件编译&#xff0c;还可以根据条件&#xff0c;选择性地对某些内容进行忽略。 来认识一下#ifdef、#else、#endif这三种条件编译指令&#xff1a; #include <stdio.h>// ifdef用于判断是否定义了符号PI&#xff0c;如果没有的话则处理以下的指令 #ifdef PI#de…

redis序列化数据时,如何包含clsss类型信息?

通过配置 com.fasterxml.jackson.databind.ObjectMapper 的 enableDefaultTyping 方法&#xff0c;可以使序列化后的 JSON 包含类信息。 大家可能留意过&#xff0c;在redis里缓存的数据经常有下面两种形式。不难发现&#xff0c;这两者的区别就是后者包含了JavaObject类型信息…

《黑神话:悟空》天命人速通法宝 | 北通鲲鹏20智控游戏手柄评测

《黑神话:悟空》天命人速通法宝 | 北通鲲鹏20智控游戏手柄评测 哈喽小伙伴们好&#xff0c;我是Stark-C~ 截止目前&#xff0c;《黑神话:悟空》已经面世一个多月&#xff0c;不知道还有多少天命人没有通关呢&#xff1f; 作为国内首款真正意义上的3A大作&#xff0c;《黑神话…

新手教学系列——用 VSCode 实现高效远程开发

随着软件开发环境日益复杂,远程开发已成为许多开发者的日常工作方式。尤其当项目需要直接在服务器上运行或本地计算资源有限时,能够使用一款便捷、强大的工具至关重要。在众多 IDE 中,VSCode 因其轻量、灵活且支持丰富插件,成为远程开发的理想选择。本文将详细介绍如何通过…

等保测评:如何建立安全的电子邮件系统

等保测评下的电子邮件系统安全建设 等保测评是中国信息安全等级保护制度的重要组成部分&#xff0c;它要求信息系统根据安全等级采取相应的保护措施。在建立安全的电子邮件系统时&#xff0c;应遵循以下等保测评的要求&#xff1a; 安全技术要求&#xff1a;电子邮件系统应实施…

SpringCloud学习记录|day1

学习材料 2024最新SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; 学redis讲到微服务就停了&#xff0c;nginx也是。 所以嘛&#xff0c;我终于来到微服务了。 复习MyBatisP…