首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在google-protobufjs中设置enum值

如何在google-protobufjs中设置enum值
EN

Stack Overflow用户
提问于 2018-11-15 07:17:08
回答 1查看 8K关注 0票数 9

嗨,有一个proto文件如下:

代码语言:javascript
复制
enum Type
{
    A = 0;
    B = 1;
    C = 2;
}

message Message
{
    User to = 1;
    User from = 2;
    Type type = 3;
}

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

代码语言:javascript
复制
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)

我面临的问题是消息对象中的tofrom字段都得到了正确的更新,但是type仍然是null!我想不出解决办法。

这是因为在Message proto中,预期类型是Enum吗?但它的javascript是不可能的。如何在为分派创建原型时设置预期的枚举值?

注:

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

EN

回答 1

Stack Overflow用户

发布于 2018-11-24 05:05:50

原始缓冲区中的枚举使用0作为默认值(也称为未知值);来自Enum上的协议缓冲区文档

每个枚举定义都必须包含一个常量,将其映射为0作为其第一个元素。这是因为:

  • 必须有一个零值,以便我们可以使用0作为一个数字默认值。
  • 为了与proto2语义兼容,零值需要是第一个元素,其中第一个枚举值总是默认的。

关于默认值的更多信息

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

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

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

除了在枚举中不将任何有意义的值定义为0之外,您不能做更多的事情,而是使用抛出值,比如NONEUNSPECIFIED

代码语言:javascript
复制
enum Type
{
    NONE = 0;
    A = 1;
    B = 2;
    C = 3;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53314212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档