定义协议缓存字典(Define dictionary in protocol buffer)

2019-06-26 06:30发布

我是新来的两个协议缓冲区和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的便利)。 有没有做到这一点更简单的方法?

Answer 1:

你可以使用自定义的选项与每个枚举成员字符串相关联: 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库不明白这些选项。



文章来源: Define dictionary in protocol buffer