我对协议缓冲区和C ++都不熟悉,所以这可能是一个基本问题,但我没有找到答案的运气。基本上,我希望我的.proto
文件中定义的字典功能类似于enum
。我使用协议缓冲区发送数据,我想定义单位及其各自的名称。 enum
允许我定义单位,但我不知道如何将人类可读的字符串映射到该单位。
作为我的意思的一个例子,.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的便利性宠坏的人来说)。有没有更简单的方法来实现这一目标?
答案 0 :(得分:5)
您可以使用自定义选项将字符串与每个枚举成员相关联: 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库不理解这些选项。
答案 1 :(得分:0)
在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);