【Protobuf專題】(一)基於IDEA實現Proto一站式編輯及編譯

0 前言

Protobuf做爲一種輕量、高效、可擴展的數據存儲語言,被普遍應用於數據傳輸中。目前對於Proto編輯及編譯,最傳統的方法是先基於文本編輯軟件撰寫proto文件,再經過Google提供的protoc程序以命令行的形式編譯成java類文件,最後再將生成的java類文件移至project的相應位置。傳統的方法比較麻煩,本文將基於IDEA講述一種一站式編輯及編譯的方法。java

1 安裝

一、下載protoc解析器protobuf-java-3.14.0.zip
二、在IDEA中安裝插件。包括GenProtobuf和Protocol Buffer Editor,前者用於一鍵轉換proto文件,後者用於編輯proto文件(未安裝前,IDEA不支持對proto語法,沒有高亮顯示和自動補全提示)。
image.pnggit

注意:若是沒有在IDEA的插件市場中搜到以上兩個插件,多是IDEA的版本低了,所以須要升級IDEA到2020版。

2 配置

一、配置Maven
pom.xml文件中添加以下依賴包:github

<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>

二、配置GenProtobuf
IDEA菜單欄 --> Tools --> Configure GenProtobuf --> 配置地址
image.pngsegmentfault

  • protoc path是下載的protoc.exe的地址。
  • 本文的目的是將proto生成java類,所以生成對象選爲java,並填寫相應地址。

3 使用

一、編輯proto
安裝好Protocol Buffer Editor插件後,無需配置便可使用,由圖可見,proto語法的關鍵字高亮顯示了,便於編輯。
image.png測試

二、編譯proto
右鍵proto文件,能夠看見兩個跟proto有關的選項,一個是「quick gen protobuf here」,另外一個是「quick gen protobuf rules」。前者表示在proto所在的文件路徑下生成java文件,後者表示按配置的地址生成java文件。
image.pngui

前文已經配置好了java生成的路徑,咱們選擇後者生成便可,效果如圖:
image.png
其中,MyTest即爲test.proto生成的java類。google

4 測試

生成了java類文件後,咱們就能夠測試其序列化和反序列化功能,若是能夠正常運行並解析正確,說明咱們的操做無誤。spa

測試代碼:插件

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...

相關文章
相關標籤/搜索