如何将 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;
是否有可能在 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;