Protobuf入門

一、安裝

我在win10端下載的是 protoc-3.11.4-win64.zip,根據平臺不同按需下載。
下載地址

二、IDEA安裝Protobuf插件

在這裏插入圖片描述

三、編寫 proto 文件

數據類型對應不同語言的如下:
在這裏插入圖片描述

syntax = "proto3"; // PB協議版本

import "google/protobuf/any.proto"; // 引用外部的message,可以是本地的,也可以是此處比較特殊的 Any

package jet.protobuf; // 包名,其他 proto 在引用此 proto 的時候,就可以使用 test.protobuf.PersonTest 來使用,
// 注意:和下面的 java_package 是兩種易混淆概念,同時定義的時候,java_package 具有較高的優先級

option java_package = "com.haya.rabbitmq.message"; // 生成類的包名,注意:會在指定路徑下按照該包名的定義來生成文件夾
option java_outer_classname="ProtoMessage"; // 生成類的類名,注意:下劃線的命名會在編譯的時候被自動改爲駝峯命名

message PersonTest {
    int32 id = 1; // int 類型
    string name = 2; // string 類型
    string email = 3;
    Sex sex = 4; // 枚舉類型
    repeated PhoneNumber phone = 5; // 引用下面定義的 PhoneNumber 類型的 message
    map<string, string> tags = 6; // map 類型
    repeated google.protobuf.Any details = 7; // 使用 google 的 any 類型

    // 定義一個枚舉
    enum Sex {
        DEFAULT = 0;
        MALE = 1;
        Female = 2;
    }

    // 定義一個 message
    message PhoneNumber {
        string number = 1;
        PhoneType type = 2;

        enum PhoneType {
            MOBILE = 0;
            HOME = 1;
            WORK = 2;
        }

    }

}

四、編譯成Java類

protoc  --java_out=./ ./demo.proto

五、使用生成的Java類

demo.proto文件編譯後生成ProtoMessage.java,而在demo.proto文件中定義的PersonTest 則是ProtoMessage靜態類。

5.1、創建對象

ProtoMessage的空參數構造方法是private的,所以無法直接new出來。這裏ProtoMessage實現了構造器模式去實例化PersonTest對象。

ProtoMessage.PersonTest person= ProtoMessage.PersonTest.newBuilder().setName( "名字" ).build();

5.2、對象轉化爲byte[]

byte[] buf = person.toByteArray();

5.3、byte[]轉對象

ProtoMessage.PersonTest person = ProtoMessage.PersonTest.parseFrom(buf);

六、其它

參考:Protobuf 使用指南
Json與Protobuf性能對比: 點我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章