Protobuf3語法

官網原文:https://developers.google.cn/protocol-buffers/docs/proto3 

syntax = "proto3";// 文件首個非空、非註釋的行必須表明protobuf的版本,默認是proto2

//import
import "google/protobuf/wrappers.proto";
import "src/main/proto/other.proto"; //import 導入的定義僅在當前文件有效,也就是當前文件只能引用other.proto直接定義的
                                     //import public 導入的定義是可以被傳遞引用的,也就是other.proto中如果
                                    //通過import public引用的new.proto,當前文件是可以引用new.proto定義的內容

//package
package cn.sdut.majiatao; //指定包名後,會對生成的代碼產生影響,以Java爲例,生成的類會以你指定的package作爲包名
                          // 同時引入的.proto文件的路徑也需要改動


//option
option java_package = "cn.sdut.majiatao"; // 編譯器爲以此作爲生成的Java類的包名,如果沒有該選項,則會以pb的package作爲包名

option java_multiple_files = true;// 該選項爲true時,生成的Java類將是包級別的,
                                  //如果是false,則所有的message和service都將會是java_outer_classname的內部類

//option optimize_for = SPEDD;// 對生成的代碼的一種優化,有三個值:SPEED,  CODE_SIZE, LITE_RUNTIME;
                            //表示希望生成代碼是偏向執行速度,還是生成的文件大小,如果在app端,代碼文件的大小是很重要的。
//message
// message 邏輯上類似於一個Java class,由多個字段(屬性)構成,
// 每一個字段:由類型、名稱組成,等號右邊的數值不是默認值,而是數字簽名碼,不可重複
message SearchRequest {
    string query = 1;
    int32 page_number = 2;
    int32 result_per_page = 3;
    repeated string args = 4;// 等同於Java中的List<String> args

    // 每個枚舉類有對應的數值,數值不一定是連續的。
    // 第一個枚舉值必須是0並且至少有一個枚舉值
    enum Corpus{
        option allow_alias = true;
        UNIVERSAL = 0;// 默認
        WEB = 1;
        IMAGES = 2;
        LOCAL = 3;
        // 如果一個數值需要對應多個枚舉值,必須標明 option allow_alias = true
        FRAMEWORK = 1;
    }
    Result result = 5;// 字段類型也可以引用其他的message類型
}


message Result {
    string url = 1;
    repeated string snippets = 2;
}

//scalar value type
//類型
// 1. for strings, the default value is the empty string
// 2. for bytes, the default value is the empty bytes
// 3. for bools, the default value is false
// 4. for numeric types, the default value is zero
// 5. for enums, the default value s the first defined enum value, which must be 0
// 6. for message fields, the field is not set, Iys exact value is language-dependent
// 7. for repeated fields, the default value is empty list
//PS:if a scalar message field is set to its default, the value will not be serialized on the wire.
// 如果一個字段的值等於默認值(如bool類型字段爲false),那麼它將不會被序列化

// Any
// Any類型 需要import "google/protobuf/any.proto"
// Any類型可以允許包裝任意的message類型
import "google/protobuf/any.proto";
message Response {
    google.protobuf.Any data = 1;
}


//Oneof
//Oneof 有一些字段最多只能有一個被設置,任何一個字段被設置,其他字段會自動成爲默認值
// 該類型不支持repeated
message SampleMessage {
    oneof test_oneof {
        string last_name = 1;
        string family_name = 2;
    }
}



// Maps
message MapsMessage {
    // 除了float、bytes、枚舉類型作爲key,其他scalar value types都可以作爲key
    // 除了map之外的任意類型可以作爲value
    // map類型字段不支持repeated,value順序是無序的
    map<string, SearchRequest> searchRequest = 1;
}

 

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