• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            每天早晨叫醒你的不是鬧鐘,而是夢(mèng)想

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              62 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

             轉(zhuǎn)載自:Protocol Buffers Language Guide之proto文件類型格式分析[關(guān)鍵點(diǎn)翻譯] | 漂泊如風(fēng)
            1、 
            定義一個(gè)消息類型:

            message SearchRequest {

            required string query = 1;

            optional int32 page_number = 2;

            optional int32 result_per_page = 3;

            }

            A.特定域的類型:兩個(gè)整型變量page_number和result_per_page、一個(gè)string類型的變量query。也可以定義為其他類型如:枚舉和其它message類型。

            B. 指派一個(gè)標(biāo)簽:這個(gè)標(biāo)簽是唯一的,它的范圍可以使1~229-1,當(dāng)然19000~19999是不可以使用的,因?yàn)閜rotocol buffer內(nèi)部使用。其中1~15保留為經(jīng)常使用的消息元素。

            C. 指定字段規(guī)則:指定的消息字段的規(guī)則有以下幾種:a.required 一個(gè)結(jié)構(gòu)良好的message必須有一個(gè)這樣的字段。b.optional 結(jié)構(gòu)良好的message有零個(gè)或者一個(gè)這樣的字段。c.repeated 這個(gè)字段可以重復(fù)任意多次(包括零次)。說(shuō)明:在repeated后面加上[packed = true]可以取得更高效的編碼。如:repeated int32 samples = 4 [package=true];

            D.可以在一個(gè)文件中添加多個(gè)message,在編譯生成cpp代碼后,將對(duì)應(yīng)多個(gè)類。

            E. Proto注釋的添加和cpp一樣,用雙斜杠即可。

            F. 運(yùn)行protocol buffer 編譯器按照指定的選項(xiàng)生成特定語(yǔ)言的代碼,在生成的代碼中包含了對(duì)proto文件中聲明的變量的設(shè)定、取得、序列化消息到輸出流和從輸入流中分解出你的消息的操作。詳細(xì)可以參考對(duì)應(yīng)語(yǔ)言的protocol buffer API。

            2、 標(biāo)量值類型

            標(biāo)量消息字段有表中以下幾種(對(duì)應(yīng)項(xiàng)為自動(dòng)生成的類中的類型):

            .proto Type Notes C++ Type Java Type
            double double double
            float float float
            int32 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. int32 int
            int64 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. int64 long
            uint32 Uses variable-length encoding. uint32 int[1]
            uint64 使用變長(zhǎng)編碼 uint64 long[1]
            sint32 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. int32 int
            sint64 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. int64 long
            fixed32 Always four bytes. More efficient than uint32 if values are often greater than 228. uint32 int[1]
            fixed64 Always eight bytes. More efficient than uint64 if values are often greater than 256. uint64 long[1]
            sfixed32 Always four bytes. int32 int
            sfixed64 Always eight bytes. int64 long
            bool bool boolean
            string A string must always contain UTF-8 encoded or 7-bit ASCII text. string String
            bytes May contain any arbitrary sequence of bytes. string ByteString

            3、 Optional字段的默認(rèn)值

            設(shè)定方法如:optional int32 result_per_page = 3 [default = 10];

            如果沒(méi)有指定則:string默認(rèn)值為空串,bool為false,數(shù)字類型的為零,枚舉類型的默認(rèn)值為枚舉定義列表中的第一個(gè)值。

            4、 枚舉

            message SearchRequest {
              required string query = 1;
              optional int32 page_number = 2;
              optional int32 result_per_page = 3 [default = 10];
              enum Corpus {
                UNIVERSAL = 0;
                WEB = 1;
                IMAGES = 2;
                LOCAL = 3;
                NEWS = 4;
                PRODUCTS = 5;
                VIDEO = 6;
              }
              optional Corpus corpus = 4 [default = UNIVERSAL];
            }

            外部message可以通過(guò)MessageType.EnumType取得其中的值

            5、 使用其他的message類型

            message也可以作為一個(gè)類型進(jìn)行使用,例如:

            message SearchResponse {

            repeated Result result = 1;

            }

            message Result {

            required string url = 1;

            optional string title = 2;

            repeated string snippets = 3;

            }

            當(dāng)然一個(gè)message可以在不同的文件中進(jìn)行定義,使用的時(shí)候可以使用import進(jìn)行加入:import “myproject/other_protos.proto”;

            6、 嵌套類型

            message SearchResponse {

            message Result {

            required string url = 1;

            optional string title = 2;

            repeated string snippets = 3;

            }

            repeated Result result = 1;

            }

            上面例子中,result在SearchResponse中進(jìn)行定義,如果希望在外部的message中調(diào)用result,你可以使用:Parent.Type:

            message SomeOtherMessage {

            optional SearchResponse.Result result = 1;

            }

            當(dāng)然了也可以嵌套一個(gè)消息任意深度:

            message Outer {                  // Level 0
              message MiddleAA {  // Level 1
                message Inner {   // Level 2
                  required int64 ival = 1;
                  optional bool  booly = 2;
                }
              }
              message MiddleBB = {  // Level 1
                message Inner = {   // Level 2
                  required int32 ival = 1;
                  optional bool  booly = 2;
                }
              }
            }

            分組:在創(chuàng)建一個(gè)新的message類型時(shí),這種特點(diǎn)一般不被贊成使用,往往用嵌套的message類型代替。

            message SearchResponse {

            repeated group Result = 1 {

            required string url = 2;

            optional string title = 3;

            repeated string snippets = 4;

            }

            }

            只是用了大括號(hào)進(jìn)行括起來(lái),注意標(biāo)點(diǎn)!這個(gè)和上面的那個(gè)例子是一致的。

            7、 更新一個(gè)消息類型

            一個(gè)已經(jīng)存在的message類型不再滿足你的需要,在不改變以前定義的格式的基礎(chǔ)上進(jìn)行更新。遵照如下規(guī)則:

            A、 不要改變已經(jīng)存在字段的數(shù)字標(biāo)簽。

            B、 任何你添加的新字段應(yīng)該是optional或者repeated類型。

            C、 非必須字段可以被刪除,同時(shí)標(biāo)簽數(shù)字在你更新的message類型中不再被使用。(更好的方法是為字段更名,可以加上OBSOLETE_前綴,這樣將來(lái)使用你的proto文件的用戶就不能意外的使用這個(gè)數(shù)字了)

            D、一個(gè)非必須的字段可以轉(zhuǎn)變?yōu)橐粋€(gè)擴(kuò)展,反過(guò)來(lái)也一樣,同時(shí)類型和數(shù)字保持不變。

            E、 int32、uint32、int64、uint64和bool都是兼容的。

            F、 sint32和sint64是兼容的,但是并不與其他整型數(shù)兼容。

            G、string和bytes相互兼容。

            H、 嵌入message和bytes兼容

            I、 fixed32和sfixed32,fixed64和sfixed64兼容

            8、 擴(kuò)展

            舉例:

            message Foo {
              // ...
              extensions 100 to 199;
            }

            字段數(shù)字[100, 199]保留用以擴(kuò)展,其他用戶可以再Foo中使用這些標(biāo)記數(shù)字添加新的字段,如下:

            extend Foo {

            optional int32 bar = 126;

            }

            這樣就在Foo中添加了類型為int32的新字段bar,在編譯生成的文件中訪問(wèn)擴(kuò)展字段的方法稍有不同:

            Foo foo;

            foo.SetExtension(bar, 15);

            其他的處理方法有HasExtension(),ClearExtension(),GetExtension(),MutableExtension(), andAddExtension().

            說(shuō)明:擴(kuò)展字段可以是任何字段類型,包括message類型。

            擴(kuò)展的嵌套:

            message Baz {

            extend Foo {

            optional int32 bar = 126;

            }

            }

            C++訪問(wèn)擴(kuò)展的方法:

            Foo foo;

            foo.SetExtension(Baz::bar, 15);

            唯一不同的就是在bar前面加了個(gè)Baz,就這么簡(jiǎn)單。

            提倡不是用嵌套的擴(kuò)展。

            擴(kuò)展標(biāo)簽數(shù)字的選擇:

            message Foo {

            extensions 1000 to max;

            }

            max= 229 – 1, 或者 536,870,911.但是不包含19000~19999,具體原因參照上文。

            9、 

            舉例:

            package foo.bar;

            message Open { … }

            在另外一個(gè)message中使用這個(gè)包的方法:

            message Foo {

            required foo.bar.Open open = 1;

            }

            生成的C++代碼中package被聲明為命名空間。Open將在命名空間foo::bar中。

            10、 服務(wù)的定義

            舉例如下:

            service SearchService {

            rpc Search (SearchRequest) returns (SearchResponse);

            }

            11、 選項(xiàng)

            。。。

            12、 產(chǎn)生你的類

            下載源碼,配置并編譯源碼生成編譯器。編譯參數(shù):

            protoc –proto_path=IMPORT_PATH –cpp_out=DST_DIR –java_out=DST_DIR –python_out=DST_DIR path/to/file.proto

            說(shuō)明:

            a. LMPORT_PATH是指定你的.proto文件坐在的目錄。

            b. 提供以下輸出:

            –cpp_out在DST_DIR產(chǎn)生C++代碼

            –java_out在DST_DIR產(chǎn)生Java代碼

            –python_out在DST_DIR產(chǎn)生python代碼

            c. 必須提供一個(gè)或者多個(gè).proto文件作為輸入。當(dāng)然多個(gè).proto文件可以同時(shí)被指定編譯。

            posted on 2011-04-05 18:29 沛沛 閱讀(674) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 開源庫(kù)
            色综合久久88色综合天天| 国产巨作麻豆欧美亚洲综合久久| 久久亚洲AV成人无码软件| 婷婷久久综合九色综合九七| 武侠古典久久婷婷狼人伊人| 亚洲精品无码久久久久AV麻豆| 婷婷国产天堂久久综合五月| 精品久久久久久久国产潘金莲| 要久久爱在线免费观看| 日日狠狠久久偷偷色综合0| 伊人久久大香线蕉精品不卡| 久久午夜无码鲁丝片秋霞| 精品伊人久久大线蕉色首页| 少妇精品久久久一区二区三区 | 色婷婷综合久久久久中文一区二区| 香蕉aa三级久久毛片| 亚洲国产成人久久综合野外| 久久无码AV中文出轨人妻| 性做久久久久久久久老女人| 中文字幕无码精品亚洲资源网久久| 久久综合给合久久国产免费| 久久人人爽人人爽人人片av高请 | 精品久久8x国产免费观看| 亚洲一本综合久久| 中文字幕无码久久精品青草| 久久精品水蜜桃av综合天堂| 91久久九九无码成人网站| 久久久高清免费视频| 狠狠色婷婷综合天天久久丁香| 久久久噜噜噜久久| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 少妇无套内谢久久久久| 99久久婷婷国产综合亚洲| 精品无码久久久久久国产| 亚洲中文字幕久久精品无码APP| 人人狠狠综合久久亚洲婷婷| 中文字幕精品久久| 久久久久久免费一区二区三区| yy6080久久| 99久久99久久精品国产片|