Proto2与C#中的Proto3

时间:2016-04-20 11:43:28

标签: c# .net protocol-buffers

我必须使用proto2版Google协议缓冲区向其他团队发送消息。他们在Linux上使用Java和C ++。我在Windows上使用C#。

Jon Skeet的protobuf-csharp-port(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的消息是兼容的。我没有使用Protocol Buffers的经验,但我正在使用的.proto文件看起来非常香草,没有默认值或oneof或嵌套任何东西。所以我似乎可以删除他们的" required"和"可选"关键字并使用新库,将其视为proto3文件。

在您看来,使用新图书馆是否值得麻烦?是否有原型功能列表会使proto2和proto3消息不兼容?

1 个答案:

答案 0 :(得分:11)

如果其他团队有任何必填字段并且您向他们发送消息而未指定这些字段(或者甚至明确指定默认值,对于基元),则另一端将无法接收消息 - 他们将无法验证。

proto2和proto3之间存在各种差异 - 一些列在releases page上:

  

以下是语言版本3的主要新功能:

     
      
  • 删除原始值字段的字段存在逻辑,删除必填字段以及删除默认值。这使得proto3更容易使用开放结构表示来实现,就像在Android Java,Objective C或Go等语言中一样。
  •   
  • 删除未知字段。
  •   
  • 删除扩展名,而是由名为Any的新标准类型替换。
  •   
  • 修复未知枚举值的语义。
  •   
  • 添加地图。
  •   
  • 添加一小组标准类型,用于表示时间,动态数据等。
  •   
  • JSON中定义良好的编码,可替代二进制原型编码。
  •   

删除未知字段对您来说可能是一个重要问题 - 如果其他团队希望能够向您发送包含您的代码不知道的某些字段的消息,并且您能够向他们返回一条消息来维护这些字段字段,proto3可能会给你带来麻烦。

如果你可以使用proto3,我建议使用proto3版本,部分因为它会有适当的支持,而proto2版本基本上处于维护模式。两者之间存在显着差异,主要是在可变性方面 - proto3代码库中生成的消息类是可变的,这对于即时可用性非常有用,但在其他方面可能会带来挑战。