5

我对协议缓冲区和 C++ 都是新手,所以这可能是一个基本问题,但我没有任何运气找到答案。基本上,我想要在我的.proto文件中定义的字典的功能,例如enum. 我正在使用协议缓冲区发送数据,并且我想定义单位及其各自的名称。Anenum将允许我定义单位,但我不知道如何将人类可读的字符串映射到该单位。

作为我的意思的一个例子,该.proto文件可能看起来像:

message DataPack {
    // obviously not valid, but something like this
    dict UnitType {
        KmPerHour = "km/h";
        MiPerHour = "mph";
    }

    required int id = 1;
    repeated DataPoint pt = 2;

    message DataPoint {
        required int id = 1;
        required int value = 2;
        optional UnitType theunit = 3;
    }
}

然后有类似创建/处理消息的东西:

// construct
DataPack pack;
pack->set_id(123);
DataPack::DataPoint pt = pack.add_point();
pt->set_id(456);
pt->set_value(789);
pt->set_unit(DataPack::UnitType::KmPerHour);

// read values
DataPack::UnitType theunit = pt.unit();
cout << theunit.name << endl; // print "km/h"

我可以enum用单位名称定义一个并编写一个函数将它们映射到接收端的字符串,但是将它们定义在同一个位置会更有意义,而且该解决方案似乎太复杂了(至少,对于某人最近被 Python 的便利性宠坏了)。有没有更简单的方法来实现这一点?

4

2 回答 2

6

您可以使用自定义选项将字符串与每个枚举成员关联: https ://developers.google.com/protocol-buffers/docs/proto#options

它在 .proto 中看起来像这样:

extend google.protobuf.FieldOptions {
  optional string name = 12345;
}

enum UnitType {
    KmPerHour = 1 [(name) = "km/h"];
    MiPerHour = 2 [(name) = "mph"];
}

但请注意,一些第三方 protobuf 库不理解这些选项。

于 2012-07-14T19:13:17.113 回答
1

在 proto3 中,它是:

extend google.protobuf.EnumValueOptions {
  string name = 12345;
}

enum UnitType {
  KM_PER_HOUR = 0 [(name) = "km/h"];
  MI_PER_HOUR = 1 [(name) = "mph"];
}

并在 Java 中访问它:

UnitType.KM_PER_HOUR.getValueDescriptor().getOptions().getExtension(MyOuterClass.name);
于 2020-10-18T18:22:57.030 回答