一、概述
ProtoBuf(Protocol Buffers),是一種廣泛使用的輕量級數據交換格式。相比XML和JSON等其他格式,它具有更高的效率、更小的體積和良好的跨平台支持。本文介紹了ProtoBuf的新版本proto3,包括語法、類型、枚舉、消息、服務、擴展等方面。
二、語法
Proto3採用了更加簡潔、易讀的語法,其中最明顯的變化是不再強制要求使用”required”、”optional”和”repeated”等關鍵字。因為在實踐中,這些關鍵字往往會導致API不兼容、代碼難以維護。現在只需要在message中定義需要的欄位即可:
syntax = "proto3"; message Book { int32 id = 1; string name = 2; int32 pages = 3; }
同時,還可以在欄位名稱和序號之間加上”=”,使其更加清晰。在上面的例子中,id、name、pages就是該message的三個欄位,它們的類型分別是int32、string和int32。類型的定義將在第三部分進行詳細介紹。
三、類型
Proto3中定義了以下幾種類型:
1.基本類型
int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64、float、double、bool、string和bytes。
2.枚舉類型
枚舉類型是一組有名字的整數常量。示例代碼如下:
enum Sex { UNKNOWN = 0; MALE = 1; FEMALE = 2; }
3.消息類型
消息類型是可嵌套的類型。在一個message中,可以包含多個類型為int、string、enum、message等的欄位。示例代碼如下:
message Person { int32 id = 1; string name = 2; int32 age = 3; Sex sex = 4; }
四、消息
消息是ProtoBuf傳輸的基本單位。每個消息都有一個message類型的名稱和一些欄位。在編寫消息時,可以使用默認值、標記為可選或必需、添加文檔等。示例代碼如下:
message Book { int32 id = 1 [default = 0]; string name = 2; repeated string author = 3; int32 pages = 4 [deprecated = true]; string brief = 5 [(google.protobuf.uninterpreted_option).string_value = "這是一本書"]; }
上面的例子中,使用了”=”和”[]”等符號進行更靈活的定義。其中,”=”用於設置默認值,”[]”用於使用標記。另外,還可以使用”(google.protobuf.uninterpreted_option)”進行添加文檔等操作。
五、服務
服務定義了一組RPC(Remote Procedure Calls)方法,可以在不同的進程或計算機之間進行調用。服務可以使用message類型定義輸入和輸出參數,並使用protobuf方法定義服務操作名稱、輸入參數名稱和輸出參數名稱。示例代碼如下:
service Library { rpc GetBook(BookRequest) returns (BookResponse) {} } message BookRequest { int32 id = 1; } message BookResponse { int32 status = 1; Book book = 2; }
六、擴展
Proto3支持擴展機制,允許在不修改原來定義的情況下,添加新的欄位。擴展點必須以extend關鍵字開始,然後是原始的message類型名稱,然後是新欄位名稱、欄位類型和欄位標記。示例代碼如下:
syntax = "proto3"; message Book { int32 id = 1; string name = 2; int32 pages = 3; extensions 100 to 199; } extend Book { int32 size = 101; }
七、總結
Proto3是ProtoBuf的新版本,在語法、類型、枚舉、消息、服務、擴展等方面進行了多項改進和優化。它更加簡潔、易讀、易於擴展,是一種更加高效的數據交換格式。我們可以根據實際需求,靈活選擇合適的數據交換格式。
原創文章,作者:GLTQL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/370585.html