kyuskoj 发表于 2021-12-11 06:16

【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 --> 配置地址


http://pic4.zhimg.com/v2-c0c491c8a2ea507d96caa62e68fa942f_r.jpg


[*]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序列化后的数据:,字节个数:2
还原后的数据=15 参考文献

protobuf那些事(一)
页: [1]
查看完整版本: 【Protobuf专题】(一)基于IDEA实现Proto一站式编辑及 ...