譯 protocol buffers簡單介紹

翻譯自:https://developers.google.com/protocol-buffers/docs/overviewhtml

 

Protocol buffers是什麼?

 

Protocol buffers是一款靈活、高效、自動化的數據描述語言。相似於XML可以將結構化數據序列化,但比XML更小,更快,更簡單。經過它,你能夠定義你的數據的結構,並生成基於各類語言的代碼。這些你定義的數據流能夠輕鬆地再傳遞並不破壞你已有的程序。而且你也能夠更新這些數據而現有的程序也不會受到任何的影響。ios

 

Protocol buffers是怎樣工做的?

 

經過定義一些數據和結構放在一個 .proto 文件之中。每個protocol buffer 消息都是一小段結構,包含了一些名字。下面是一個.proto 文件內容的樣例。git

 

  1.  
    message Person {
  2.  
    required string name = 1;
  3.  
    required int32 id = 2;
  4.  
    optional string email = 3;
  5.  
     
  6.  
    enum PhoneType {
  7.  
    MOBILE = 0;
  8.  
    HOME = 1;
  9.  
    WORK = 2;
  10.  
    }
  11.  
     
  12.  
    message PhoneNumber {
  13.  
    required string number = 1;
  14.  
    optional PhoneType type = 2 [default = HOME];
  15.  
    }
  16.  
     
  17.  
    repeated PhoneNumber phone = 4;
  18.  
    }


就像你看到的,這個消息的格式是十分簡單的——對於每一個消息類型都有一個或多個獨特的數字字段,每個字段都有一個名稱和類型,能夠是數字(整型或浮點),布爾,字符,原始字節,又或者是其它的protocol buffer消息類型,例如你自定義分層的數據結構。你還能夠定義可選的required和repeated字段。你能夠在這裏Protocol Buffer Language Guide.找到更多編寫.proto文件的信息。github

在定義好了.proto文件,就能夠將該文件做爲protocol buffers編譯器的輸入文件,編譯產生特定語言的數據定義代碼文件了。編譯器提供了簡單的訪問方法爲每一個字段(如name()和set_name())序列化/解析整個結構到原始字節——那麼,舉個栗子,若是你用的是C++,用這個編譯器運行上面的例子會產生一個叫Person的類。你能夠在你的應用中運用這個Person protocol buffer消息。你或許須要寫一些像這些的代碼:golang

 

  1.  
    Person person;
  2.  
    person.set_name( "John Doe");
  3.  
    person.set_id( 1234);
  4.  
    person.set_email( "jdoe@example.com");
  5.  
    fstream output( "myfile", ios::out | ios::binary);
  6.  
    person.SerializeToOstream(&output);


而後,你能夠像這樣讀取你的消息:編程

 

  1.  
    fstream input("myfile", ios::in | ios::binary);
  2.  
    Person person;
  3.  
    person.ParseFromIstream(&input);
  4.  
    cout << "Name: " << person.name() << endl;
  5.  
    cout << "E-mail: " << person.email() << endl;


你能夠增長一些新字段到你的消息格式中,這樣並不會影響向後兼容;舊的二進制文件解析時會簡單地忽略新的字段。因此若是你有通信的協議是用到protocol buffers看成數據格式的話,你不用擔憂擴展你的協議會影響到原有的代碼。數據結構

你能夠在這裏API Reference section找到關於使用生成protocol buffer的完整事例,你也能夠在這裏Protocol Buffer Encoding找到更多內容關於protocol buffer消息是怎樣編碼的。ide

 

爲何不使用XML?

同XML相比,Protocol buffers在序列化結構化數據方面有許多優勢:
1. 更簡單
2. 數據描述文件只需原來的1/10至1/3
3. 解析速度是原來的20倍至100倍
4. 減小了二義性
5. 生成了更容易在編程中使用的數據訪問類ui

 

舉個栗子,若是你想寫一個帶有name和email的person。在XML裏,你須要這樣寫:google

 

  1.  
    <person>
  2.  
    <name>John Doe</name>
  3.  
    <email>jdoe@example.com</email>
  4.  
    </person>


而相應的protocol buffer消息(應用protocol buffer文本格式)是:

 

  1.  
    # Textual representation of a protocol buffer.
  2.  
    # This is *not* the binary format used on the wire.
  3.  
    person {
  4.  
    name: "John Doe"
  5.  
    email: "jdoe@example.com"
  6.  
    }


當編碼這段消息到protocol buffer二進制格式時(註釋只是用來幫助人們調試和修改),它可能只有28字節和大約花費100到200納秒的解釋時間。可是若是用XML,它至少有69字節(若是你去掉空格)和花費5000到10000納秒的解釋時間。

並且,操做protocol buffer更加容易:

 

  1.  
    cout << "Name: " << person.name() << endl;
  2.  
    cout << "E-mail: " << person.email() << endl;

若是用XML,你不得不作這些事:

 

  1.  
    cout << "Name: "
  2.  
    << person.getElementsByTagName("name")->item(0)->innerText()
  3.  
    << endl;
  4.  
    cout << "E-mail: "
  5.  
    << person.getElementsByTagName("email")->item(0)->innerText()
  6.  
    << endl;


然而,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的應用。

 

proto3介紹

 

咱們最近作了一個新版本——Protocol Buffers language version 3(又叫作proto3),你能夠在這裏下載alpha release,咱們加了一些新特性。咱們簡化了這個語言,如今能夠用在更多的語言上了(C++,Python,JavaNano,Ruby,Objective-C和C#,不過有一些限制some limitations)。你還能夠用在Go上,經過最新的Go protoc插件golang/protobuf。咱們還在計劃在更多的語言上用到protocol buffers。

還有一些內容和歷史的問題就不翻譯了。

相關文章
相關標籤/搜索