【问题标题】:How to set enum value in google-protobufjs如何在 google-protobufjs 中设置枚举值
【发布时间】:2018-11-15 07:17:08
【问题描述】:

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

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

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

我使用 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)

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

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

注意:

我注意到,这个问题只有在我尝试设置 zero 时才会发生 枚举类型的值!

【问题讨论】:

  • 哪个protobuf版本(proto2,proto3)?
  • @jannis 这是 proto3
  • 只是一个猜测(从未使用过protobuf),但你不能使用枚举本身,比如message.setType(Main.Type.A)
  • @MartinAdámek 没关系!实际上,您以两种方式传递相同的值,即一个数字。

标签: javascript protocol-buffers


【解决方案1】:

protobuffer 中的枚举使用 0 作为默认值(又名未知);来自Protocol Buffers docs on Enums

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

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

  • 零值需要是第一个元素,为了兼容 使用 proto2 语义,其中第一个枚举值始终是 默认。

更多关于defaults:

解析消息时,如果编码的消息不包含 特定的奇异元素,解析后的对应字段 对象被设置为该字段的默认值:

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

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

除了在枚举中不将任何有意义的值定义为 0 并改用丢弃值(例如 NONEUNSPECIFIED)之外,您无能为力:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多