我必须使用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功能列表?
发布于 2016-04-20 19:54:22
如果另一个团队有任何必填字段,而您向他们发送消息时没有指定这些字段(甚至没有显式指定原语的默认值),那么另一端将无法接收消息-它们不会验证。
proto2和proto3之间有各种不同之处-其中一些在releases page上列出
以下是语言版本3中的主要新功能:
Any.semantics的新标准类型,用于表示时间、动态数据等。
删除未知字段对您来说可能是一个重要的问题-如果其他团队希望能够向您发送一条消息,其中包含一些您的代码不知道的字段,而您能够向他们返回一条消息来维护这些字段,那么proto3可能会给您带来问题。
如果你可以使用proto3,我建议使用proto3版本,部分原因是它会有适当的支持,而proto2版本基本上处于维护模式。两者之间有很大的不同,主要是在可变性方面- proto3代码库中生成的消息类是可变的,这对于立即可用性很好,但可能会在其他领域带来挑战。
https://stackoverflow.com/questions/36742747
复制相似问题