翻譯自:https://developers.google.com/protocol-buffers/docs/overviewhtml
Protocol buffers是一款靈活、高效、自動化的數據描述語言。相似於XML可以將結構化數據序列化,但比XML更小,更快,更簡單。經過它,你能夠定義你的數據的結構,並生成基於各類語言的代碼。這些你定義的數據流能夠輕鬆地再傳遞並不破壞你已有的程序。而且你也能夠更新這些數據而現有的程序也不會受到任何的影響。ios
經過定義一些數據和結構放在一個 .proto 文件之中。每個protocol buffer 消息都是一小段結構,包含了一些名字。下面是一個.proto 文件內容的樣例。git
就像你看到的,這個消息的格式是十分簡單的——對於每一個消息類型都有一個或多個獨特的數字字段,每個字段都有一個名稱和類型,能夠是數字(整型或浮點),布爾,字符,原始字節,又或者是其它的protocol buffer消息類型,例如你自定義分層的數據結構。你還能夠定義可選的required和repeated字段。你能夠在這裏Protocol Buffer Language Guide.找到更多編寫.proto文件的信息。github
在定義好了.proto文件,就能夠將該文件做爲protocol buffers編譯器的輸入文件,編譯產生特定語言的數據定義代碼文件了。編譯器提供了簡單的訪問方法爲每一個字段(如name()和set_name())序列化/解析整個結構到原始字節——那麼,舉個栗子,若是你用的是C++,用這個編譯器運行上面的例子會產生一個叫Person的類。你能夠在你的應用中運用這個Person protocol buffer消息。你或許須要寫一些像這些的代碼:golang
而後,你能夠像這樣讀取你的消息:編程
你能夠增長一些新字段到你的消息格式中,這樣並不會影響向後兼容;舊的二進制文件解析時會簡單地忽略新的字段。因此若是你有通信的協議是用到protocol buffers看成數據格式的話,你不用擔憂擴展你的協議會影響到原有的代碼。數據結構
你能夠在這裏API Reference section找到關於使用生成protocol buffer的完整事例,你也能夠在這裏Protocol Buffer Encoding找到更多內容關於protocol buffer消息是怎樣編碼的。ide
同XML相比,Protocol buffers在序列化結構化數據方面有許多優勢:
1. 更簡單
2. 數據描述文件只需原來的1/10至1/3
3. 解析速度是原來的20倍至100倍
4. 減小了二義性
5. 生成了更容易在編程中使用的數據訪問類ui
舉個栗子,若是你想寫一個帶有name和email的person。在XML裏,你須要這樣寫:google
而相應的protocol buffer消息(應用protocol buffer文本格式)是:
當編碼這段消息到protocol buffer二進制格式時(註釋只是用來幫助人們調試和修改),它可能只有28字節和大約花費100到200納秒的解釋時間。可是若是用XML,它至少有69字節(若是你去掉空格)和花費5000到10000納秒的解釋時間。
並且,操做protocol buffer更加容易:
若是用XML,你不得不作這些事:
然而,protocol buffers不老是比XML好——例如,protocol buffers不是一個寫基於文本的文檔標記(例如HTML)的好方法,你不能輕易地交互結構和文本。還有,XML比較好看還好寫,但protocol buffers,即便在原始格式下,也不是很好看,很好寫。XML在某種程度上能夠自描述。protocol buffer只在你有消息定義文件(.proto文件)時纔有意義。
先在這裏Download the package下個包——這個包已經包含了各類語言(其實就只有Java,Pythin和C++)的protocol buffer編譯器完整代碼,固然,你還須要I/O和testing這些類。生成和安裝你的編譯器前,請看看README裏的說明。
當你搞定一切的時候,你能夠看看你所選擇的語言的tutorial——這會幫你創建一個簡單的用到protocol buffers的應用。
咱們最近作了一個新版本——Protocol Buffers language version 3(又叫作proto3),你能夠在這裏下載alpha release,咱們加了一些新特性。咱們簡化了這個語言,如今能夠用在更多的語言上了(C++,Python,JavaNano,Ruby,Objective-C和C#,不過有一些限制some limitations)。你還能夠用在Go上,經過最新的Go protoc插件golang/protobuf。咱們還在計劃在更多的語言上用到protocol buffers。
還有一些內容和歷史的問題就不翻譯了。