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

时间:2015-08-22 22:30:54

标签: c++ enums protocol-buffers

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

e.g:

以下是消息说明:

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);

2 个答案:

答案 0 :(得分:21)

EnumDescriptorEnumValueDescriptor类可用于此类操作,以及 生成的.pb.h.pb.cc名称很容易阅读,因此您可以查看它们以获取它们提供的功能的详细信息。

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

std::string requestTypeString = MyMessage_RequestType_Name(requestType);

答案 1 :(得分:5)

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

EnumDescriptor文档说:

  • 获取EnumDescriptor

      

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

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

      

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

         

    按编号查找值。

         

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

示例,获取protobuf枚举:

google.visualization.events.addListener(my_chart, 'ready', function () {
   chart_div.innerHTML = '<img src="' + my_chart.getImageURI() + '">';
   var html_data = document.getElementById('img_container');
   console.log(html_data.innerHTML);
});

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

enum UserStatus {
  AWAY = 0;
  ONLINE = 1;
  OFFLINE = 2;
}