Protobuf重复消息选项

5
我正在尝试通过扩展google.protobuf.MessageOptions将一些文档元信息附加到protobuf消息中。我的某个元信息选项可能会出现多次。看起来我可以声明重复的选项,但我如何在消息上使用它呢?
以下是我尝试实现的示例:
extend google.protobuf.MessageOptions {
    optional string description = 51234;
    repeated string usages = 51235;
}

message MyMsg {
    option (description) = "MyMsg description";
    option (usages) = ???

    optional bool myFlag = 1;
    optional string myStr = 2;
}

如果我想记录两种不同的用法,那么在“???”处我应该输入什么?

1个回答

7

如果我没记错的话,你可以多次指定一个重复选项:

message MyMsg {
  option (description) = "MyMsg description";
  option (usages) = "usage1";
  option (usages) = "usage2";

  optional bool myFlag = 1;
  optional string myStr = 2;
}

编辑:访问重复字段的方法未记录,需要查看标头,因此我决定将其添加到此答案中:

auto opts = MyMsg::descriptor()->options();
std::cout << opts.GetExtension(description) << std::endl;
for (int i = 0; i < opts.ExtensionSize(usages); ++i)
    std::cout << opts.GetExtension(usages, i) << std::endl;

重复选项怎么办?如何设置它们? - Gill Bates
抱歉,我是指“重复的复合选项”。 - Gill Bates
@GillBates 啊...我其实不确定是否可以表达,但是自从我写那段代码以来已经很长时间了。也许可以用TextFormat(在{}大括号中)编写它们? - Kenton Varda
2
根据此处的文档,@GillBates,其语法如下:message Bar { optional int32 a = 1 [(foo_options).opt1 = 123, (foo_options).opt2 = "baz"];
// 另一种聚合语法(使用TextFormat): optional int32 b = 2 [(foo_options) = { opt1: 123 opt2: "baz" }]; }
- danbars
@danbars,哇,另一种语法确实有效!它在哪里描述的?我在文档中找不到它。 - Gill Bates
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接