Protocol buffers grpc和protobuf-当另一方不同步释放时,如何处理新字段
我遇到了一种情况,grpc通信的另一端与他们的发布不同步。因此,我的上级希望我在短时间内(如两周)添加一个字段,如果对方填写或不填写,该字段将起作用 我相信我可以通过将它添加到proto消息的末尾来做到这一点,这样其他字段的索引就不会改变。根据我在谷歌上搜索到的,可选字段在3.15版本之前不可用,所以我必须使用变通方法 向我介绍的解决方法是使用中的一种。然而,我不是100%确定那是什么样子。所有的例子都显示了字段本身。属于其中一个值的索引是否独立于属于消息其余部分的索引Protocol buffers grpc和protobuf-当另一方不同步释放时,如何处理新字段,protocol-buffers,grpc,Protocol Buffers,Grpc,我遇到了一种情况,grpc通信的另一端与他们的发布不同步。因此,我的上级希望我在短时间内(如两周)添加一个字段,如果对方填写或不填写,该字段将起作用 我相信我可以通过将它添加到proto消息的末尾来做到这一点,这样其他字段的索引就不会改变。根据我在谷歌上搜索到的,可选字段在3.15版本之前不可用,所以我必须使用变通方法 向我介绍的解决方法是使用中的一种。然而,我不是100%确定那是什么样子。所有的例子都显示了字段本身。属于其中一个值的索引是否独立于属于消息其余部分的索引 message Test
message TestMessage {
string somefield = 1;
int someotherfield = 2;
oneof mynewoptionalfield
{
string mynewfield = ???? Does this have to be 3 or is it 1?
int ifihadanother = ???? Does this need to be 4 or 2?
}
}
问题:
- 我使用的索引是什么???标记是
- 当另一方不打算重新编译和部署对原型文件的更改时,这是正确的解决方法吗 <>我如何检查字段是否用C++代码填充?< /LI>
message TestMessage {
string somefield = 1;
int someotherfield = 2;
string mynewfield = 3;
}
您不必使用3
作为id。您可以使用4、10或10000。但是对于protobuf来说,较小的数字更有效,通常只选择“下一个”id。在连线上,protobuf使用id标识字段,因此以后不要更改id很重要
在protobuf 3中,所有字段在protobuf 2意义上都是“可选的”;没有“必填”字段。然而,protobuf 2也为所有字段提供了“现场存在”。Protobuf 3仅为其中一个OF和消息提供现场存在。。。直到最近重新引入“可选”关键字
在protobuf 3中,如果调用textMessage.getMynewfield()
它将始终返回非空字符串。如果未发送字符串,它将使用空字符串(“”
)。对于整数0
返回,对于消息返回“默认消息”(所有默认值)。这对于许多用例来说已经足够了,并且可能对您来说已经足够了
但假设您需要区分“
和
。这就是现场存在所提供的。protobuf 3中的消息具有“has”方法,如果存在值,则返回true
。但是原语没有这种存在信息。一个选项是使用“框”原语,使原语成为消息。protobuf较新版本中的另一个可用选项是optional
关键字。这两个选项都将提供类似于textMessage.hasMynewfield()
的方法
message TestMessage {
string somefield = 1;
int someotherfield = 2;
google.protobuf.StringValue mynewfield = 3;
// -or-
optional string mynewfield = 3;
}