1. 程式人生 > >Google ProtoBuf簡介

Google ProtoBuf簡介

最近在學習蘑菇街的TeamTalk開原始碼,新版的程式碼中包含了最新的很多框架和技術,其中包括了谷歌的Protocol Buffer簡稱ProtoBuf,該篇文章是我通過閱讀谷歌開發者中心後的學習總結,順便吐槽下,國內的網路真是蛋疼,現在家庭寬頻或者有些單位的寬頻連谷歌開發者中心都訪問不了,更別談什麼facebook啥的了,我能訪問谷歌開發者中心是通過一個VPN工具LoCo加速器,雖然是付費的,但是一不貴也就幾十塊錢一個月,速度和穩定性都不錯,用來訪問網頁足夠了。

閒話不多說,進入正題,需要詳細瞭解ProtoBuf的童鞋可以自己訪問谷歌開發者中心:https://developers.google.com/protocol-buffers/

簡介

ProtoBuf是一種靈活高效的獨立於語言平臺的結構化資料表示方法,可用於表示通訊協議和資料儲存等各方面,與XML相比,ProtoBuF更小更快更簡單。你可以用定義自己ProtoBuf的資料結構,用ProtoBuf編譯器生成特定語言的原始碼,(如C++,Java,Python等,目前ProtoBuf對主流的程式語言都提供了支援)方便的進行序列化和反序列化。

ProtoBuf 工作機制

在一個字尾名為.pro的檔案中定義你所需的任何需要序列化和反序列的結構,類似於中我們C/C++語言中的結構體定義,也類似於JSON類定義,ProtoBuf檔案的每一個屬性都是一個鍵值對,引用谷歌官方的例子說明,一個包含Person資訊的.pro檔案。
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}
.pro檔案的每一個屬性都是一個包含型別和名稱的對,protobuf的型別可以是string,int,bool,或者是其他ProtoBuf原始檔中定位的型別等。還開元指定該屬性的一些特殊欄位,比l如optional表示該屬性是可選的,required表示該屬性是必須的,repeated表示該屬性是一個list的集合(不知道用list類似形容是否合適,就差不多意思吧,包含1個或多個元素),包含了若干個相同型別的值,不過在protoBuf 3中,optional和required都不需要的了,如果配了兩個,protoBuf 編譯器還會報錯,但是repeated的還是保留的,用來說明該欄位是一個list。 .protoBuf定義完以後,就可以使用ProtoBuf編譯器進行編譯,編譯時需要指定你需要生成的程式碼的語言型別。.pro檔案編譯成功後會生成*.pro.pb.hh 和*.pro.pb.cc兩個檔案,*和.pro原始檔名稱相同。在生成的檔案中會生成一個你定義的訊息型別的的類以及讀取和設定該訊息型別各個屬性的set和Get方法等,比如上例中會生成一個Person類,和name(),set_name()這樣的成員方法,以及序列化和反序列的方法,你可以用這些方法方便的讀取和設定相應的屬性,以及序列化和反序列化方法。 你可以像如下的方式序列化
Person person;
person.set_name("John Doe");
person.set_id(1234);
person.set_email("
[email protected]
"); fstream output("myfile", ios::out | ios::binary); person.SerializeToOstream(&output);

可以像如下方式反序列化,讀取各個欄位
fstream input("myfile", ios::in | ios::binary);
Person person;
person.ParseFromIstream(&input);
cout << "Name: " << person.name() << endl;
cout << "E-mail: " << person.email() << endl;

ProtoBuf的一個亮點是提供了向前和向後的相容性,你可以再你定義的訊息格式中增加欄位或者刪除欄位,當訊息由一個增加欄位後的系統向一個老版本系統傳送訊息時,老版本解析該訊息格式後會直接忽略新增的欄位,而當訊息從老版本發向新版本時,新版本解析該訊息時會將新增的欄位設定為預設值,所以你不需要擔心在系統中增加訊息欄位後的相容問題以及版本升級配套問題。

為什麼不用XML

在序列化和反序列化結構化資料時,ProtoBuf擁有XML很多無可比擬的優勢: 1、它比XML更為簡單。這點顯而易見 2、儲存同樣的資料比XML小3到10倍 3、執行速度比XML快20到100倍 4、更小的二義性 5、直接利用類和成員方法序列化反序列化資料更有利於程式設計。 比如你需要定義個結構化資料Person,包含了name和email屬性,在XML中你會這樣定義:
  <person>
    <name>John Doe</name>
    <email>[email protected]</email>
  </person>

而在ProtoBuf中的定義是這樣的:
# Textual representation of a protocol buffer.
# This is *not* the binary format used on the wire.
person {
  name: "John Doe"
  email: "[email protected]"
}
如果將上述的ProtoBuf檔案序列化,它僅僅佔據28個位元組的空間,解析該檔案也僅僅需要100到200納秒,而相同的XML檔案至少需要69個位元組儲存資料(除去空白),解析該XML檔案至少需要10000納秒,而在對資料的操作方面ProtoBuf的操作也更加簡單:
  cout << "Name: " << person.name() << endl;
  cout << "E-mail: " << person.email() << endl;

而XML將會做如下動作:
  cout << "Name: "
       << person.getElementsByTagName("name")->item(0)->innerText()
       << endl;
  cout << "E-mail: "
       << person.getElementsByTagName("email")->item(0)->innerText()
       << endl;

然而,ProtoBuf與XML相比,有某些用途下並不是一個很好的解決方案,如ProtoBuf,並不適合用於給基本標籤的文字文件建模,此外XML是易讀的,自描述的,而ProtoBuf的二進位制文件並不是自描述的,除非擁有資料的原始檔,否則你很難理解序列化後的檔案中的內容,它是一個二進位制檔案。

該篇文章對ProtoBuf作了一個簡短的介紹,簡單來說可按如下步驟使用ProtoBuf: 1、定義你自己的資料結構格式(.pro)原始檔。 2、利用protoBuf提供的編譯器編譯原始檔。 3、使用ProtoBuf C++的API 讀寫訊息。


下一篇文章將介紹如何安裝和使用ProtoBuf

相關推薦

Google ProtoBuf簡介

最近在學習蘑菇街的TeamTalk開原始碼,新版的程式碼中包含了最新的很多框架和技術,其中包括了谷歌的Protocol Buffer簡稱ProtoBuf,該篇文章是我通過閱讀谷歌開發者中心後的學習總結,順便吐槽下,國內的網路真是蛋疼,現在家庭寬頻或者有些單位的寬頻連谷歌開發

Google 的開源技術protobuf 簡介與例子

今天來介紹一下“Protocol Buffers”(以下簡稱protobuf)這個玩意兒。本來俺在構思“生產者/消費者模式 ”系列的下一個帖子:關於生產者和消費者之間的資料傳輸格式。由於裡面扯到了protobuf,想想幹脆單獨開一個帖子算了。   ★protobuf

ImportError:No module named google.protobuf.internal

google logs protobuf clas font times pan cond family 當在anaconda中import caffe 時提示錯誤: 1 ImportError:No module named google.protobuf.intern

error: ‘kEmptyString’ is not a member of ‘google::protobuf::internal’

ring anaconda uil ble /usr nac space locate bin 最近安裝caffe,突然報這個錯: .build_release/src/caffe/proto/caffe.pb.h: In member function ‘void caf

Google Protobuf在Netty中的使用

連接 delay exce gin bootstrap 語言 sync socket cau [toc] Google Protobuf在Netty中的使用 程序代碼來自於《Netty權威指南》第8章,已經加了註釋,不過需要註意的是,使用的proto源代碼是在Google

caffe make error: class google::protobuf::RepeatedField<unsigned int> has no member named 'UnsafeMergeFrom'

sig name image member clas 5.0 http ogl ted 之前caffe中protobuf的版本是2.5.0,可在ternimal下執行:protoc --version 查看當前protobuf版本。 由於另外安裝了Tensorflow之後,

Google protobuf解析消息邏輯的版本問題

mage logs 有一個 https itl 2-2 -i clip 源代碼 在分析caffe2源碼的過程中,由於caffe2使用protobuf作為網絡結構和網絡參數序列化和反序列化的機制,想在反序列化之前進行加解密處理,這是反向protouf其實有兩個版本的實

Google Protobuf——實現跨平臺跨語言的序列化/反序列化

Google Protobuf——實現跨平臺跨語言的序列化/反序列化 0 Overview Google Protocol Buffer 是一個平臺無關、語言無關的結構化資料的序列化與反序列化工具。 1 Establish dev environment wget http:

由引入 Google Protobuf 引發的工程管理思考

看到標題,很多人可能會在想這個 Google Protobuf (後面簡稱 PB ) 是一個什麼東東,其實最開始我聽說的時候也在懷疑,甚至一開始我還以為是之前跟著大牛寫服務端功能時使用的 Thrift 混為一談,深入接觸後才發現,其實不然。至於 PB 到底是啥呢?我在這就不詳細介

[轉]google protobuf安裝與使用

google protobuf是一個靈活的、高效的用於序列化資料的協議。相比較XML和JSON格式,protobuf更小、更快、更便捷。google protobuf是跨語言的,並且自帶了一個編譯器(protoc),只需要用它進行編譯,可以編譯成Java、python、C++、C#、Go等程式碼,然

ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf…的問題

人工智慧/機器學習/深度學習交流QQ群:811460433 程式設計師深度學習微信公眾號: ubuntu16.04下編譯caffe出現.build_release/lib/libcaffe.so: undefined reference to google ::protobuf…的

Google Docs 簡介

摘自網路   Google Docs 谷歌文件包括線上文件、電子表格和簡報三類。使用者可以輕易地執行所有的基本操作,包括編制專案列表、按列排序、新增表格/影象/註釋/公式、更改字型,還有更多操作。它是完全免費的。Google 文件接受最常見的檔案格式,包括 DOC、XLS、OD

Google protobuf訊息巢狀c++實現

protobuf3.1.0的安裝見:https://blog.csdn.net/mircosheng/article/details/70141704 安裝完protobuf後,新建.proto檔案,本文命名為lm.helloworld. proto 在網路通訊系統中,protobuf能夠提升通

Netty學習之路(八)-Google Protobuf編碼

Protobuf是一個靈活,高效,結構化的資料序列化框架,相比於XML等傳統的序列化工具,它更小,更快,更簡單。Protobuf支援資料結構化一次可以到處使用,甚至可以跨語言使用,通過程式碼生成工具可以自動生成不同語言版本的原始碼,甚至可以在使用不同版本的資料結構程序間進行資料傳遞,實現資料

基於google protobuf的gRPC實現(python版)

title: 基於google protobuf的gRPC實現(python版) date: 2018-08-14 12:01:12 tags: [protobuf,RPC,gRPC] categories: protobuf mathjax: False 1.Protobuf

gRPC快速入門(一)——Protobuf簡介

gRPC快速入門(一)——Protobuf簡介 一、Protobuf簡介 1、Protobuf簡介 Protobuf即Protocol Buffers,是Google公司開發的一種跨語言和平臺的序列化資料結構的方式,是一個靈活的、高效的用於序列化資料的協議。與XML和JSON格式相比,protobuf更

Google Protobuf 3版本介紹

本文編寫時, Google 官方的 protobuf 版本是3.0.0beta 下面介紹下proto3的一些細節變化 Proto3的語法變化 語法標記 這個版本的protoc的protobuf編譯器已經可以支援proto2語法和proto3的語法 如果你的proto檔案沒有新增syntax說明的話,

Google protobuf 使用及原理

簡介 什麼是 Google Protocol Buffer? 假如您在網上搜索,應該會得到類似這樣的文字介紹: Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言資料標準,目前已經正在使用的有超過 48,162 種報文格式定義和

centos 安裝google protobuf

2012-03-29 http://abloz.com author:ablozhou date:2012.3.29 環境 cat /etc/redhat-release CentOS release 5.5 (Final)

python google protobuf 使用

2011-12-28 google protobuf由於採用二進位制打包,資料量很小,又支援主流的java,c,python語言,所以尤其適合於mobile客戶端與伺服器的通訊。相對於xml,html,json等格式,有其獨特優