嗨,有一个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)我面临的问题是消息对象中的to和from字段都得到了正确的更新,但是type仍然是null!我想不出解决办法。
这是因为在Message proto中,预期类型是Enum吗?但它的javascript是不可能的。如何在为分派创建原型时设置预期的枚举值?
注:
我注意到,只有当我尝试将
zero值设置为Enum类型时,才会出现此问题!
发布于 2018-11-24 05:05:50
原始缓冲区中的枚举使用0作为默认值(也称为未知值);来自Enum上的协议缓冲区文档
每个枚举定义都必须包含一个常量,将其映射为0作为其第一个元素。这是因为:
关于默认值的更多信息
当分析消息时,如果编码的消息不包含特定的单数元素,则解析对象中的相应字段设置为该字段的默认值:
默认的枚举甚至不会在有线上发送。您可以在使用零值枚举序列化消息之后检查您的buffer。由于默认值与未设置值是不可区分的,因此它处理反序列化的方式实际上是在解码器端。
除了在枚举中不将任何有意义的值定义为0之外,您不能做更多的事情,而是使用抛出值,比如NONE或UNSPECIFIED。
enum Type
{
NONE = 0;
A = 1;
B = 2;
C = 3;
}https://stackoverflow.com/questions/53314212
复制相似问题