如何在谷歌protobufjs中设置枚举值

时间:2018-11-15 07:17:09

标签: javascript protocol-buffers

嗨,有一个原始文件,如下:

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原型中,期望的类型是Enum吗?但它的JavaScript是不可能的。在创建要分发的protobuf时如何设置期望的枚举值?

注意:

  

我注意到,仅当我尝试设置zero时,才会发生此问题   枚举类型的值!

1 个答案:

答案 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并使用抛弃型值(例如bufferNONE)之外,您无能为力:

UNSPECIFIED