5

私はプロトコルバッファと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の便利さに甘やかされている人)。これを達成するためのより簡単な方法はありますか?

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 に答える