首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Proto2与C#中的Proto3

Proto2与C#中的Proto3
EN

Stack Overflow用户
提问于 2016-04-20 19:43:28
回答 1查看 14.6K关注 0票数 9

我必须使用Google Protocol Buffers的proto2版本向另一个团队发送消息。他们在Linux上使用Java和C++。我在Windows上用的是C#。

Jon Skeet的协议Jon csharp-port (https://github.com/jskeet/protobuf-csharp-port)支持proto2。如果我没理解错的话,谷歌已经将这段代码放入了主protobuf项目(https://github.com/google/protobuf/tree/master/csharp)中。但它不再支持C#的proto2,只支持proto3。

我不确定我应该使用哪个项目。看起来新的版本将得到更好的支持(性能,如果其他团队升级了,对proto3的支持)。但我必须将proto2提供的.proto文件转换为proto3,并冒着由此带来的任何问题的风险。

我已经了解到大部分情况下,proto2和proto3的消息是兼容的。我没有使用Protocol Buffers的经验,但是我正在处理的.proto文件看起来很普通,没有默认值,也没有任何嵌套的东西。因此,我似乎可以删除它们的“必需”和“可选”关键字,并使用新的库,将其视为proto3文件。

在您看来,使用新的库值得麻烦吗?是否有使proto2和proto3消息不兼容的proto功能列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-20 19:54:22

如果另一个团队有任何必填字段,而您向他们发送消息时没有指定这些字段(甚至没有显式指定原语的默认值),那么另一端将无法接收消息-它们不会验证。

proto2和proto3之间有各种不同之处-其中一些在releases page上列出

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

  • 删除原始值字段的字段存在逻辑,删除必填字段,以及删除默认值。这使得使用开放结构表示法更容易实现,就像在Android Java、Objective C或Go等语言中一样。删除了未知的扩展名为Any.
  • Fix fields.
  • Removal of proto3的新标准类型,取而代之的是一种名为

semantics的新标准类型,用于表示时间、动态数据等。

  • 作为二进制原型编码的替代方案,在JSON中定义良好的编码。

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

如果你可以使用proto3,我建议使用proto3版本,部分原因是它会有适当的支持,而proto2版本基本上处于维护模式。两者之间有很大的不同,主要是在可变性方面- proto3代码库中生成的消息类是可变的,这对于立即可用性很好,但可能会在其他领域带来挑战。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36742747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档