“Int32”和“google.protobuf.Int32Value”有什么区别?

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

jpa*_*jpa 6

Int32Value是在wrappers.proto中定义的包装器消息类型。据我所知,它用于以可移植的方式表示“可能缺少 int32”,因为所有语言都没有可为空的类型。对于普通字段,proto3语法会自动将缺失的整数设置为零值。

内部Int32Value被编码为子消息,因此用int32字段替换它会破坏消息类型兼容性。

在 2021 年发布的 protobuf 3.15 版本中,proto3 语法还添加了对可选字段的支持。因此,我认为没有任何理由再用于Int32Value新项目,尽管它将继续支持与旧消息类型的兼容性。

即使是 proto3 可选字段也不会作为本机可空类型公开,并且需要单独使用.HasField()调用。