如何在 google-protobufjs 中设置枚举值

dem*_*ist 7 javascript protocol-buffers

您好,有一个 proto 文件,如下所示:

enum Type
{
    A = 0;
    B = 1;
    C = 2;
}

message Message
{
    User to = 1;
    User from = 2;
    Type type = 3;
}
Run Code Online (Sandbox Code Playgroud)

我使用protoc编译器将其转换为 javascript 实用程序类。使用这个生成的 javascript 文件,我在我的应用程序中设置了 Message 对象,如下所示:

const message = new Main.Message()
message.setTo(this.user1) // saved user
message.setFrom(this.user3) // saved user
message.setType(0) // trying to set type to A

const buffer = message.serializeBinary()
socket.send(buffer)
Run Code Online (Sandbox Code Playgroud)

我面临的问题是消息对象tofrom字段都得到了正确更新,但type仍然存在null!我无法为此找到解决方案。

这是因为在Messageproto 中,预期类型是 Enum 吗?但它 javascript 是不可能的。如何在创建用于调度的 protobuf 时设置预期的枚举值?

笔记:

我注意到,只有当我尝试将zero 值设置为 Enum 类型时才会发生此问题!

shk*_*per 9

protobuffer 中的枚举使用 0 作为默认(也称为未知)值;来自Enums 上的 Protocol Buffers 文档

每个枚举定义必须包含一个映射到零作为其第一个元素的常量。这是因为:

  • 必须有一个零值,以便我们可以使用 0 作为数字默认值。

  • 零值必须是第一个元素,以便与 proto2 语义兼容,其中第一个枚举值始终是默认值。

有关默认值的更多信息:

解析消息时,如果编码的消息不包含特定的单一元素,则解析对象中的相应字段将设置为该字段的默认值:

  • 对于枚举,默认值是第一个定义的枚举值,该值必须为 0。

默认枚举甚至不会通过网络发送。buffer您可以通过在使用零值枚举序列化消息后检查您的消息来进行检查。由于默认值与未设置的值无法区分,因此反序列化后的处理方式实际上是在解码器端。

除了不在枚举中将任何有意义的值定义为 0 并使用废弃值之外,您对此无能为力,例如NONEor UNSPECIFIED

enum Type
{
    NONE = 0;
    A = 1;
    B = 2;
    C = 3;
}
Run Code Online (Sandbox Code Playgroud)