0 前言

Protobuf作为一种轻量、高效、可扩大的数据存储语言,被广泛应用于数据传输中。目前对于Proto编辑及编译,最传统的办法是先基于文本编辑软件撰写proto文件,再通过Google提供的protoc程序以命令行的模式编译成java类文件,最初再将生成的java类文件移至project的相应地位。传统的办法比拟麻烦,本文将基于IDEA讲述一种一站式编辑及编译的办法。

1 装置

1、下载protoc解析器:protobuf-java-3.14.0.zip
2、在IDEA中装置插件。包含GenProtobuf和Protocol Buffer Editor,前者用于一键转换proto文件,后者用于编辑proto文件(未装置前,IDEA不反对对proto语法,没有高亮显示和主动补全提醒)。

留神:如果没有在IDEA的插件市场中搜到以上两个插件,可能是IDEA的版本低了,因而须要降级IDEA到2020版。

2 配置

1、配置Maven
pom.xml文件中增加如下依赖包:

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

2、配置GenProtobuf
IDEA菜单栏 --> Tools --> Configure GenProtobuf --> 配置地址

  • protoc path是下载的protoc.exe的地址。
  • 本文的目标是将proto生成java类,因而生成对象选为java,并填写相应地址。

3 应用

1、编辑proto
装置好Protocol Buffer Editor插件后,无需配置即可应用,由图可见,proto语法的关键字高亮显示了,便于编辑。

2、编译proto
右键proto文件,能够看见两个跟proto无关的选项,一个是“quick gen protobuf here”,另一个是“quick gen protobuf rules”。前者示意在proto所在的文件门路下生成java文件,后者示意按配置的地址生成java文件。

前文曾经配置好了java生成的门路,咱们抉择后者生成即可,成果如图:

其中,MyTest即为test.proto生成的java类。

4 测试

生成了java类文件后,咱们就能够测试其序列化和反序列化性能,如果能够失常运行并解析正确,阐明咱们的操作无误。

测试代码:

package learnProto.selfTest;import com.google.protobuf.InvalidProtocolBufferException;import learnProto.selfTest.MyTest.*;import java.util.Arrays;public class Test {    public static void main(String[] args) {        convertProto(1);    }    public static void convertProto(int value) {        //1.通过build创立音讯结构器        Data.Builder dataBuilder = Data.newBuilder();        //2.设置字段值        dataBuilder.setInt32(value);        //3.通过音讯结构器结构音讯对象        Data data = dataBuilder.build();        //4.序列化        byte[] bytes = data.toByteArray();        System.out.println(value+"序列化后的数据:" + Arrays.toString(bytes)+",字节个数:"+bytes.length);        //5.反序列化        try {            Data parseFrom = Data.parseFrom(bytes);            System.out.println("还原后的数据="+parseFrom.getInt32());        } catch (InvalidProtocolBufferException e) {            e.printStackTrace();        }    }}

运行后果:

1序列化后的数据:[24, 1],字节个数:2还原后的数据=1

5 参考文献

[1]https://segmentfault.com/a/11...