乐趣区

关于protobuf:Protobuf专题一基于IDEA实现Proto一站式编辑及编译

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…

退出移动版