「ProtocolBuffers2」ProtocolBuffers2 c++简易入门
官網的快速入門
官網的詳細教程
c++api參考
c++生成代碼說明
pb編碼參考
下文中提到的pb是protocol buffers的縮寫
什么是protocol buffers
pb是谷歌推出的序列化結構數據的一種方法,提供高效、快速、簡便的數據編碼,支持的語言包括python,c++,java,oc等。本文以C++為例。
定義一個message
message顧名思義就是消息的意思,在pb中message類似于c++或python中的類,但也只是在形式上類似,定義一個message就相當于定義了一種消息類型。
message SearchRequest {required string query = 1;optional int32 page_number = 2;optional int32 result_per_page = 3; }在上面的例子中,定義了一個名為SearchRequest的message,在該條message中聲明了三個域,分別是string類型的query、int32型的page_number和int32型的result_per_page。
三個域分別對應獨一無二的三個數字1、2、3,如果有第四個域的話,那么它的編號是4,以此類推。每個域對應的序號第幾位沒有要求,一旦使用就不能再修改;且每個域的編號不能重復。這些數字用于消息二進制編碼中區分不同的域,其中1-15的編碼只占1個字節的內存,16-2047占兩個字節內存,因此最好將一些常用的域放在1-15號編號中,便于提高讀取效率。
此外,19000到19999是不能使用的,留作pb內部部署,如果使用的話會報錯。
域類型
從上面中我們可以看到,每個域有不同類型。在pb中,域類型一共有三種:
- required:一個message中必須帶有該類型的域,一般不使用,容易導致bug
- optional:一個message中最多帶一個該類型的域
- repeated:一個message中的該域可以重復多次,包括零;意思是接收該域時存儲的是一個域的有序序列
此外還有一個點需要注意一下,官網說由于過去的原因,repeated類型的域為int32,int64,enum等類型時,并不能進行高效的編碼,因此新的生命可以通過使用在域聲明最后加上一個[packed=true]來提高編碼效率,例如:
repeated int32 samples = 4 [packed=true]; repeated ProtoEnum results = 5 [packed=true];總結
以上是生活随笔為你收集整理的「ProtocolBuffers2」ProtocolBuffers2 c++简易入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 军校和警校政审材料都交了,然后第一志愿填
- 下一篇: 在哪里看欧赔进球双数赔率