在协议缓存枚举延伸读取值(Read value of enum extension in proto

2019-07-30 11:20发布

我刚才问这个问题,并且已经解决了写在我的协议缓冲区枚举值的延伸。 但是我有一个非常困难的时刻实际读取值回,即使这个简单的.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文件,而不是从他们回读的 - 我该怎么办呢? 简单例子将被极大地理解。 提前致谢。

Answer 1:

这看起来有点令人费解,但你需要获得EnumValueDescriptor的电话类型,然后调用options().GetExtension(test::abbr)这一点。

例如:

test::Person person;
person.set_name("Caol Ila");
person.set_id(1);

test::Person::PhoneNumber *phone = person.add_phone();
phone->set_number("01496 840207");
phone->set_type(test::Person::MOBILE);

phone = person.add_phone();
phone->set_number("01496 840207");
phone->set_type(test::Person::HOME);

phone = person.add_phone();
phone->set_number("01496 840207");
phone->set_type(test::Person::WORK);

phone = person.add_phone();
phone->set_number("01496 840207");

const google::protobuf::EnumDescriptor* enum_desc =
    test::Person::PhoneType_descriptor();
std::string value;

for (int phone_index = 0; phone_index < person.phone_size(); ++phone_index) {
  if (person.phone(phone_index).has_type()) {
    int phone_type = person.phone(phone_index).type();
    value = enum_desc->value(phone_type)->options().GetExtension(test::abbr);
  }
}


文章来源: Read value of enum extension in protocol buffer