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

Dictionary 在协议缓冲区中定义字典 我对协议缓冲区和C++都是新手,所以这可能是一个基本问题,但我没有找到任何答案。基本上,我希望在.proto文件中定义字典的功能,就像枚举一样。我正在使用协议缓冲区发送数据,我想定义单元及其各自的名称。enum允许我定义单位,但我不知道如何将人类可读的字符串映射到该单位,dictionary,protocol-buffers,Dictionary,Protocol Buffers,例如,.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

例如,
.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"
//构造
数据包;
包装->设置标识(123);
DataPack::DataPoint pt=pack.add_point();
pt->set_id(456);
pt->设置_值(789);
pt->设置单位(数据包::单位类型::公里/小时);
//读取值
数据包::UnitType theunit=pt.unit();

cout您可以使用自定义选项将字符串与每个枚举成员关联:

它在.proto中看起来是这样的:

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

enum UnitType {
    KmPerHour = 1 [(name) = "km/h"];
    MiPerHour = 2 [(name) = "mph"];
}
但是,请注意,一些第三方protobuf库不了解这些选项。

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

第一:这个问题与C++无关,你应该删除这个标签。第二:我认为这超出了protobuf为数据提供高效有线格式的主要目的。我会选择枚举可读的字符串映射解决方案。虽然使用protobuf插件会很好,但可以生成必要的映射代码,例如使用特殊的注释标记。这看起来正是我想要的,尽管我认为我需要使用
EnumValueOptions
而不是
FieldOptions
。谢谢但是,我不太容易用C++访问结果——你能给出一个简短的例子来检索这些值吗?FI,我发布了一个问题,要求你读一个例子,找到一个工作解决方案。再次感谢你为我指明了正确的方向!你知道protobuf3团队为什么忽略了保留偶数字符串或int常量的功能吗??这是使用.proto文件的最基本的gimme和最明显的特性——为跨平台消息模式提供一个源文件。啊!