2016-04-20 79 views
5

我必須使用Google協議緩衝區的proto2版本向其他團隊發送消息。他們在Linux上使用Java和C++。我在Windows上使用C#。Proto2與C#中的Proto3相比較

喬恩斯基特的protobuf的-CSHARP端口(https://github.com/jskeet/protobuf-csharp-port)支持proto2。如果我理解正確,Google已將此代碼並將其更新版本摺疊到主protobuf項目(https://github.com/google/protobuf/tree/master/csharp)中。但它不再支持C#的proto2,只支持proto3。

我不知道我應該使用哪個項目。看起來新的支持將得到更好的支持(如果其他團隊進行升級,則可以支持proto3)。但是我必須將我從proto2提供的.proto文件轉換爲proto3,並冒任何與此相關的問題。

我讀過,在大多數情況下,對於proto2和proto3消息是兼容的。我沒有協議緩衝區的經驗,但我正在使用的.proto文件看起來很漂亮,沒有默認值,也沒有嵌套任何東西。因此,我似乎可以刪除他們的「必需」和「可選」關鍵字,並使用新的庫,將其視爲proto3文件。

在您看來,使用較新的庫是否值得麻煩?是否有一個proto功能列表可以使proto2和proto3消息不兼容?

回答

8

如果其他球隊有任何必填字段,你向他們發送信息,而無需指定這些字段(或者甚至明確指定默認值,元)然後將另一端將無法接收消息 - 他們不會驗證。

有proto2和proto3之間的各種差異 - 一些都被列在releases page

以下是語言版本3的主要新特徵:

  • 字段存在邏輯的去除對原始值字段,刪除必填字段以及刪除默認值。這使得proto3更容易用開放結構表示來實現,就像Android Java,Objective C或Go等語言一樣。
  • 清除未知字段。
  • 刪除擴展名,取而代之的是名爲Any的新標準類型。
  • 修復未知枚舉值的語義。
  • 添加地圖。
  • 添加了一組用於表示時間,動態數據等的標準類型
  • 在JSON中作爲二進制原型編碼的替代方案的定義良好的編碼。

未知領域的去除可能是一個顯著的問題給你 - 如果其他球隊希望能夠向您發送一些領域你的代碼是不知道的消息,您可以返回消息給他們維護這些領域,proto3可能會給你帶來問題。

如果你可以使用proto3,我會建議使用proto3版本,部分原因是它會有適當的支持,而proto2版本基本上處於維護模式。兩者之間存在顯着差異,主要是在可變性方面 - proto3代碼庫中生成的消息類是可變的,這對立即可用性很好,但可能在其他領域帶來挑戰。

+1

仍然無法相信他們擺脫了默認設置:( –

+0

[proto2](https://developers.google.com/protocol-buffers/docs/proto)的語言指南將地圖列爲支持。嘗試使用proto編譯器3與[proto3](https://developers.google.com/protocol-buffers/docs/proto3#default),它似乎忽略設置爲默認值的字段(int與0已從二進制和json中刪除表示) – Manoj

+0

@Manoj:我認爲它們在某種程度上受到支持,但不是所有語言都支持,而且很可能有稍微不同的語義。不知道你的意思是「它似乎忽略用默認值設置的字段」。只是意味着「值0沒有序列化」,那麼你是對的 –