当前位置: 首页 > 图灵资讯 > 技术篇> java 中protobuf 编译proto 文件

java 中protobuf 编译proto 文件

来源:图灵教育
时间:2024-02-02 13:26:04

使用 Protocol Buffers 编译 Proto 文件

在 Java 我们经常在开发中使用它 Protocol Buffers(简称为 Proto)对数据进行序列化和反序列化。Proto 它是一种轻量级的数据交换格式,能够有效地序列化结构化数据,并提供跨语言、跨平台的支持。本文将介绍如何在这里 Java 中使用 Proto 编译 Proto 文件,并提供相应的代码示例。

Proto 文件介绍

Proto 用于定义数据结构和服务界面的文件 .proto 后缀。使用它 Proto 语言描述信息的字段和类型,类似于定义一个结构。以下是一个简单的 Proto 文件示例:

syntax = "proto3";message Person {  string name = 1;  int32 age = 2;  repeated string hobbies = 3;}

上述 Proto 文件定义了一个名字 Person 包括新闻类型 name、age 和 hobbies 三个字段。name 字段类型为 string,age 字段类型为 int32,hobbies 字段是一个 repeated 字段表示字符串数组可重复出现。

Proto 编译工具

Proto 需要通过文件 Proto 编译工具生成相应的编译工具 Java 代码。Proto 通过以下方式可以获得编译工具:

  • Maven:添加 protobuf-maven-plugin 插件到 pom.xml 并在文件中执行 Maven 编译命令。
  • Gradle:添加 protobuf 插件到 build.gradle 并在文件中执行 Gradle 编译命令。
  • 手动下载:从 Protocol Buffers GitHub 仓库(
使用 Maven 编译 Proto 文件

下面以 Maven 例如,介绍如何使用它 Maven 编译 Proto 文件。

首先,在 pom.xml 文件中添加 protobuf-maven-plugin 插件配置:

<build>  <plugins>    <plugin>      <groupId>org.xolstice.maven.plugins</groupId>      <artifactId>protobuf-maven-plugin</artifactId>      <version>0.6.1</version>      <configuration>        <protocExecutable>protoc</protocExecutable>        <outputDirectory>${project.build.directory}/generated-sources/proto</outputDirectory>      </configuration>      <executions>        <execution>          <goals>            <goal>compile</goal>          </goals>        </execution>      </executions>    </plugin>  </plugins></build>

指定了上述配置 protoc 生成可执行文件的路径和路径 Java 代码输出目录。

接下来,执行命令行 Maven 命令进行 Proto 文件编译:

mvn compile

执行完成后,生成 Java 在指定的输出目录中保存代码。

在 Java 使用生成的代码

编译完成后,我们可以 Java 数据的序列化和反序列化用于代码中生成的代码。

首先,我们需要在项目的依赖中添加生成的代码,可以通过 Maven 或者手动添加。假设生成的代码在包名中 com.example.proto 我们可以通过以下方式导入生成的类:

import com.example.proto.Person;

接下来,我们可以使用生成的代码创建、序列化和反序列化 Person 对象。以下是一个简单的例子:

Person person = Person.newBuilder()    .setName("Alice")    .setAge(20)    .addHobbies("Reading")    .addHobbies("Swimming")    .build();byte[] data = person.toByteArray();// 将字节数组写入文件或网络传输//// 字节数组Person从文件或网络读取 parsedPerson = Person.parseFrom(data);System.out.println("Name: " + parsedPerson.getName());System.out.println("Age: " + parsedPerson.getAge());System.out.println("Hobbies: " + parsedPerson.getHobbiesList());

在上述代码中,我们首先使用生成的代码创建一个代码 Person 对象,并设置相应的字段值。然后,通过调用 toByteArray 方法将 Person 对象序列化为字节数组。我们可以将字节数组写入文件或通过网络传输。之后,我们可以从文件或网络中读取字节数组并使用它 parseFrom 方法是将字节数组反序列化 Person 对象。最后,我们可以获得反序列化 Person