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

How to get protobuf enum as string?

是否有可能在 C++ 中获得与 protobuf 枚举等效的字符串?

例如:

以下为留言说明:

package MyPackage;

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

    optional RequestType requestType = 1;
}

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

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

// requestTypeString will be "Login"
std::string requestTypeString = ProtobufEnumToString(requestType);

EnumDescriptor and EnumValueDescriptor类可以用于这种操作,而 生成的 .pb.h.pb.cc 名称很容易阅读,因此您可以浏览它们以获取有关它们提供的功能的详细信息。

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

std::string requestTypeString = MyMessage_RequestType_Name(requestType);

Josh Kelley, use the EnumDescriptor and EnumValueDescriptor的回答。

EnumDescriptor 文档说:

  • 获取一个 EnumDescriptor

    To get the EnumDescriptor for a generated enum type, call TypeName_descriptor(). Use DescriptorPool to construct your own descriptors.

  • 要获取字符串值,请使用 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.

例如,获取 protobuf 枚举:

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;