protobuf入门教程(二):消息类型
操作流程
1)在.proto文件中定義消息格式?
2)使用protobuf編譯器生成C++類?
3)使用C++ API來讀寫消息
C++編程指導:https://developers.google.com/protocol-buffers/docs/cpptutorial
消息格式
syntax = "proto3"; //指定版本信息,不指定會報錯message Person //message為關鍵字,作用為定義一種消息類型 {string name = 1; //姓名int32 id = 2; //idstring email = 3; //郵件 }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
消息由至少一個字段組合而成,類似于C語言中的結構體,每個字段都有一定的格式:
數據類型 字段名稱 = 唯一的編號標簽值;- 1
- 1
- 字段名稱:protobuf建議以下劃線命名而非駝峰式
- 唯一的編號標簽:代表每個字段的一個唯一的編號標簽,在同一個消息里不可以重復。這些編號標簽用與在消息二進制格式中標識你的字段,并且消息一旦定義就不能更改。需要說明的是標簽在1到15范圍的采用一個字節進行編碼,所以通常將標簽1到15用于頻繁發生的消息字段。編號標簽大小的范圍是1到229。此外不能使用protobuf系統預留的編號標簽(19000 ~19999)。
數據類型
| double | double | 64位浮點數 |
| float | float | 32位浮點數 |
| int32 | int32 | 32位整數 |
| int64 | int64 | 64位整數 |
| uint32 | uint32 | 32位無符號整數 |
| uint64 | uint64 | 64位無符號整數 |
| sint32 | int32 | 32位整數,處理負數效率比int32更高 |
| sint32 | sint64 | 64位整數,處理負數效率比int64更高 |
| fixed32 | uint32 | 總是4個字節。如果數值總是比總是比228大的話,這個類型會比uint32高效。 |
| fixed64 | uint64 | 總是8個字節。如果數值總是比總是比256大的話,這個類型會比uint64高效。 |
| sfixed32 | int32 | 總是4個字節 |
| sfixed64 | int64 | 總是8個字節 |
| bool | bool | 布爾類型 |
| string | string | 一個字符串必須是UTF-8編碼或者7-bit ASCII編碼的文本 |
| bytes | string | 處理多字節的語言字符、如中文 |
| enum | enum | 枚舉 |
| message | object of class | 自定義的消息類型 |
更多詳情請看:https://developers.google.com/protocol-buffers/docs/encoding
proto文件
proto文件即消息協議原型定義文件,在該文件中我們可以通過使用描述性語言,來良好的定義我們程序中需要用到數據格式。
通過查看頭文件,可以發現針對每個字段都會大致生成如下幾種函數,以name為例:
void clear_name(); void set_name(const ::std::string& value); void set_name(const char* value); void set_name(const char* value, size_t size); const ::std::string& name() const; ::std::string* mutable_name();- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
可以看出,對于每個字段會生成一個clear清除函數(clear_name)、set函數(set_name)、get函數(name和mutable_name)。
這兒解釋下get函數中的兩個函數的區別: 對于原型為const std::string &number() const的get函數而言,返回的是常量字段,不能對其值進行修改。但是在有一些情況下,對字段進行修改是必要的,所以提供了一個mutable版的get函數,通過獲取字段變量的指針,從而達到改變其值的目的。
參考資料:http://www.cnblogs.com/royenhome/archive/2010/10/29/1864860.html
總結
以上是生活随笔為你收集整理的protobuf入门教程(二):消息类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: protobuf入门教程(一):简介和安
- 下一篇: protobuf入门教程(三):常用序列