【发布时间】:2012-07-13 16:20:45
【问题描述】:
我对协议缓冲区和 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 的便利性宠坏的人来说)。有没有更简单的方法来做到这一点?
【问题讨论】:
-
1st:这个问题与C++无关,你应该去掉这个标签。第二:我认为这超出了 protobuf 的主要目的,即为数据提供有效的有线格式。我会选择 enum 可读字符串映射解决方案。虽然最好使用 protobuf 插件来生成必要的映射代码,例如使用特殊的注释标签。
标签: dictionary protocol-buffers