2015-01-10 38 views
19

最近(2015年1月)微軟公開源Bond,他們的架構化數據工作框架。在很多方面它與Google的Protocol Buffers類似。微軟債券與谷歌協議緩衝區之間的差異

這兩者之間最大的區別是什麼?有什麼優點和缺點,也就是說,我想在哪種情況下使用一種,但不使用另一種?當然,我並不是在談論諸如與其他項目或已經存在的API的一致性等明顯的事情,而是談論這兩個庫的特性。舉個例子,Bond有bonded<T>,如果我沒有記錯的話,在Protocol Buffers中沒有對應的。

+0

覆蓋[已經很好](http://microsoft.github.io/bond/why_bond.html)。 –

+0

@HansPassant謝謝你指出(我不知道我怎麼會錯過那個頁面)。另一方面,我認爲從框架的創建者那裏聽到其他人也會很高興。 – dtldarek

回答

26

一般來說,Bond具有更好的類型系統並支持多種協議。

特別是,優點是:

  • 邦德支持泛型
  • 債券具有不同類型的代表集合:vector<T>map<T>list<T>
  • 債券支持類型安全懶惰反序列化(bonded<T>
  • Bond支持多種格式(快速二進制,緊湊二進制,XML,JSON)+編組和轉碼

缺點:

  • 邦德不支持不同類型的固定和可變的整數編碼。在Bond中,整數的編碼方式取決於輸出格式(快速或緊湊),但在協議緩衝區中,總是有固定大小的整數類型:fixed32fixed64
  • 債券不支持聯合類型(oneof在Protocol Buffers的)
  • 債券不具備Java實現(還)

我做了一些測試,並出現在邦德簡單的消息是大小和ProtoBuf二進制格式大致相同。我使用Bond和C#ProtoBuf庫比較了序列化和反序列化時間:在我的例子中,Bond的表現更好一些,你可以找到我的source code on GitHub

總結一下,我認爲使用Bond更好些,當你使用一些複雜類型的數據或當您需要以不同格式表示相同數據時:例如作爲二進制文件存儲,但公開爲JSON等。

+0

你有簡單的測試來證明這一點嗎? – mjsabby

+1

@mjsabby,你想看到什麼?你可以在這裏我的代碼:https://github.com/takemyoxygen/bond-performance-tests – takemyoxygen