嗨,有一个原始文件,如下:
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
原型中,期望的类型是Enum吗?但它的JavaScript是不可能的。在创建要分发的protobuf时如何设置期望的枚举值?
注意:
我注意到,仅当我尝试设置
zero
时,才会发生此问题 枚举类型的值!
答案 0 :(得分:2)
protobuffer中的枚举使用0作为默认值(即未知);来自Protocol Buffers docs on Enums:
每个枚举定义必须包含一个常数,该常数映射为零 第一个元素。这是因为:
必须有一个零值,以便我们可以将0用作数字 默认值。
为了兼容,零值必须是第一个元素 带有proto2语义,其中第一个枚举值始终是 默认。
有关defaults的更多信息:
解析邮件时,如果编码后的邮件不包含 特定的单个元素,在解析后的相应字段 对象设置为该字段的默认值:
- 对于枚举,默认值为第一个定义的枚举值,必须为0。
默认枚举甚至都不在线发送。您可以使用零值枚举对消息进行序列化后,通过检查public function delete_article(){
$id=$this->input->post('bid');
$data['success']='';
$data['error']='';
include_once ('query/user_query.php');
$this->db->where('bid', $id);
$data['countEarticle'] = $this->db->count_all_results('blog');
if($data['countEarticle'] >= 1){
$this->db->where('bid',$id);
$this->db->delete('blog');
}
if($data['countEarticle'] <= 0){
}
}
来进行检查。由于默认值与未设置的值无法区分,因此反序列化后的外观实际上是在解码器端。
除了在枚举中未将任何有意义的值定义为0并使用抛弃型值(例如buffer
或NONE
)之外,您无能为力:
UNSPECIFIED