私はちょうど この質問をし、プロトコルバッファに列挙値の拡張を書くことを決心しました。ただし、この単純な.protoファイルを使用しても、実際に値を読み戻すのは非常に困難です。
package test;
import "google/protobuf/descriptor.proto";
extend google.protobuf.EnumValueOptions {
optional string abbr = 54321;
}
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType { MOBILE = 0 [(abbr)="Mobile ph"]; HOME = 1 [(abbr)="HomePhone"]; WORK = 2 [(abbr)="Work number"]; }
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
私はこれらと他の変種を試してきました:
test::Person::PhoneNumber::descriptor()->options().GetExtension(test::abbr);
test::Person::PhoneNumber::descriptor().GetExtension(test::abbr);
test::Person::descriptor()->options().GetExtension(test::abbr);
const google::protobuf::Descriptor* message = test::Person::PhoneNumber::descriptor();
const google::protobuf::Descriptor* desc = phone2.descriptor();
desc->options().GetExtension(test::abbr); //D.N.E.
google::protobuf::MessageOptions opts = message->options();
opts.GetExtension(test::abbr);
const google::protobuf::EnumDescriptor* enm = message->FindEnumTypeByName("PhoneNumber"); // null, not found
google::protobuf::EnumValueOptions opts2 = enm->value(1)->options();
opts2.GetExtension(test::abbr);
test::Person::PhoneNumber::descriptor()->options().GetExtension(test::abbr);
上記のいずれも機能しません-メソッドがまったく存在しないか、その関数シグネチャへの一致する呼び出しがありません。私は何時間もドキュメントを調べてきましたが、役に立ちませんでした。私はそれが可能であるべきだと知っていますが、唯一の例は.protoファイルを書き込むことであり、それらから読み戻すことではありません-これを行うにはどうすればよいですか?短い例をいただければ幸いです。前もって感謝します。