北京時間7月8日訊息,據國外媒體報道,Google本周一發布了該公司內部使用的開放原始碼資料描述語言 (Data Description Language)Protocol Buffers。Protocol Buffers與XML相似,但更簡單、更小、更快。
Google開放原始碼專案經理克裡斯·迪邦納(Chris DiBona)在一篇博文中寫道,“我們在網路上傳輸或在磁碟上儲存的幾乎所有結構化資訊都採用了這種語言。我們認為Protocol Buffers可能對其他人也有用,因此我們決定將它發布為開放原始碼軟體。”
Google軟體工程師肯頓·瓦爾達(Kenton Varda)在公司的開放原始碼部落格上發表文章稱,Google使用數千種不同的資料格式,其中大多數都是結構化資料格式。XML無法勝任對這些海量結構化資料編碼的重任,Google於是開發了Protocol Buffers。
瓦爾達將Protocol Buffers比作是一種介面描述語言,但沒有介面描述語言的複雜性。他說,Protocol Buffers的主要設計目標之一是簡潔。對Protocol Buffers進行解析的速度也很快,比XML要快出至少一個量級。
Google的文檔稱,與具有可比性的XML檔案相比,Protocol Buffers檔案的尺寸要小3-10倍,解析速度要快20-100倍。
Google發布的免費檔案包括採用Java、Python和C++程式設計語言編寫的Protocol Buffers編譯器原始碼。
Google在一份文檔中表示,該公司還計劃將許多其它軟體項目發布為開放原始碼軟體。因為這些項目會用到Protocol Buffers,因此Google決定首先將它發布為開放原始碼軟體。
在Web 2.0 時代,XML格式由於AJAX的風行以及RSS的普及而異軍突起。不過隨著Python和Ruby On Rails的走紅,以及各種API的發布,YAML,JSON也逐漸成名。此次,Google推出了Protocol Buffers,是想讓廣大編程者方便地使用Google網路傳輸資料的格式。
什麼是Protocol Buffers?
這是Protocol Buffers首頁上的一段代碼:
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;
}
而Protocol Buffers的作用,就是將以上格式的資料類型,自動產生Java, Python, and C++的代碼,然後以下一系列代碼就可以直接調用了:(C++中)
Person person;
person.set_name("John Doe");
person.set_id(1234);
person.set_email("jdoe@example.com");
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;
相信所有C++編程者都為定義set,get之類的函數感到煩人過吧,而Google做的就是協助你省去這些麻煩,構造更利於網路傳輸的資料結構。
與XML的比較 優勢
更簡單
比XML小3到10倍體積
比XML快20到100倍
更不容易引起歧義
自動產生可程式化的類代碼
比較:
cout << "Name: " << person.name() << endl; cout << "E-mail: " << person.email() << endl;
cout << "Name: "
<< person.getElementsByTagName("name")->item(0)->innerText()
<< endl;
cout << "E-mail: "
<< person.getElementsByTagName("email")->item(0)->innerText()
<< endl; 劣勢
沒有層次,所以無法和HTML標記語言打交道
如果沒有message的定義,根本無法知道message的意思,而XML是自解釋型的。
Protocol Buffer首頁 Protocol Buffer下載