Mac*_*eus 3 c# protocol-buffers
我正在旧版 C# 代码库上编写 proto3 消息,我注意到如果我替换
import "google/protobuf/wrappers.proto";
import "google/protobuf/descriptor.proto";
message Foo {
google.protobuf.Int32Value blah = 1;
}
Run Code Online (Sandbox Code Playgroud)
和:
message Foo {
int32 blah = 1;
}
Run Code Online (Sandbox Code Playgroud)
解析器仍然可以工作,但是blah
接收到的0
不是正确的值。
为什么会发生这样的事?不应该int32
等于google.protobuf.Int32Value
?
Int32Value
是在wrappers.proto中定义的包装器消息类型。据我所知,它用于以可移植的方式表示“可能缺少 int32”,因为所有语言都没有可为空的类型。对于普通字段,proto3
语法会自动将缺失的整数设置为零值。
内部Int32Value
被编码为子消息,因此用int32
字段替换它会破坏消息类型兼容性。
在 2021 年发布的 protobuf 3.15 版本中,proto3 语法还添加了对可选字段的支持。因此,我认为没有任何理由再用于Int32Value
新项目,尽管它将继续支持与旧消息类型的兼容性。
即使是 proto3 可选字段也不会作为本机可空类型公开,并且需要单独使用.HasField()
调用。
归档时间: |
|
查看次数: |
4698 次 |
最近记录: |