如何将protobuf枚举作为字符串?

Ale*_*iea 24 c++ enums protocol-buffers

是否有可能在C++中获得相当于protobuf枚举的字符串?

例如:

以下是消息说明:

package MyPackage;

message MyMessage
{
    enum RequestType
    {
        Login = 0;
        Logout = 1;
    }

    optional RequestType requestType = 1;
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我希望做这样的事情:

MyMessage::RequestType requestType = MyMessage::RequestType::Login;

// requestTypeString will be "Login"
std::string requestTypeString = ProtobufEnumToString(requestType);
Run Code Online (Sandbox Code Playgroud)

Jos*_*ley 23

EnumDescriptorEnumValueDescriptor类可用于这种操纵的,而所产生的.pb.h.pb.cc名称是很容易阅读,因此,您可以查看通过他们得到他们所提供的功能的详细信息.

在这种特殊情况下,以下内容应该有效(未经测试):

std::string requestTypeString = MyMessage_RequestType_Name(requestType);
Run Code Online (Sandbox Code Playgroud)

  • 小问题:protobuf 文档建议不要使用名称混乱的全局函数,而应使用类作用域函数,因此不要使用“MyMessage_RequestType_Name”,而是使用“MyMessage::RequestType_Name”。 (2认同)

rml*_*dts 8

请参阅Josh Kelley的答案,使用EnumDescriptorEnumValueDescriptor.

EnumDescriptor文档说:

  • 获得EnumDescriptor

    要获取生成的枚举类型的EnumDescriptor,请调用TypeName_descriptor().使用DescriptorPool构建自己的描述符.

  • 要获取字符串值,请使用FindValueByNumber(int number)

    const EnumValueDescriptor*EnumDescriptor :: FindValueByNumber(int number)const

    按编号查找值.

    如果不存在此值,则返回NULL.如果多个值具有此>数字,则返回定义的第一个值.

例如,获取protobuf枚举:

enum UserStatus {
  AWAY = 0;
  ONLINE = 1;
  OFFLINE = 2;
}
Run Code Online (Sandbox Code Playgroud)

从值中读取字符串名称的代码和从字符串名称中读取的值:

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;
Run Code Online (Sandbox Code Playgroud)