protobuf列挙値は文字列への変換に対応する

1173 ワード

protobufの開発では、pbがjsonに移行し、jsonから対応するpbに移行する必要があることがよくあります.enum値には、値と文字列のマッピングのために反射が必要です.公式には対応する反射インタフェースが提供されています.
リンク:EnumValueDescriptorリンク:EnumDescriptor
  • To get a EnumDescriptor
  • To get the EnumDescriptor for a generated enum type, call TypeName_descriptor(). Use DescriptorPool to construct your own descriptors.
    
  • To get the string value, use FindValueByNumber(int number)
  • const EnumValueDescriptor * EnumDescriptor::FindValueByNumber(int number) const
    
    Looks up a value by number.
    
    Returns NULL if no such value exists. If multiple values have this >number,the first one defined is returned.
    

    example:
    enum UserStatus {
      AWAY = 0;
      ONLINE = 1;
      OFFLINE = 2;
    }
    
    
    const google::protobuf::EnumDescriptor *descriptor = UserStatus_descriptor();
    std::string name = descriptor->FindValueByNumber(UserStatus::ONLINE)->name();
    int number = descriptor->FindValueByName("ONLINE")->number();
    
    std::cout << "Enum name: " << name << std::endl;
    std::cout << "Enum number: " << number << std::endl;