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)
我面临的问题是消息对象to和from字段都得到了正确更新,但type仍然存在null!我无法为此找到解决方案。
这是因为在Messageproto 中,预期类型是 Enum 吗?但它 javascript 是不可能的。如何在创建用于调度的 protobuf 时设置预期的枚举值?
笔记:
我注意到,只有当我尝试将
zero值设置为 Enum 类型时才会发生此问题!
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)