【问题标题】:Protobuf repeated message optionProtobuf 重复消息选项
【发布时间】:2015-02-26 08:11:52
【问题描述】:

我正在尝试通过扩展 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;
}

我应该输入什么而不是 ???如果我想记录两种不同的使用方式?

【问题讨论】:

    标签: protocol-buffers


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 重复选项怎么办?如何设置它们?
    • 抱歉,我的意思是“重复复合选项”。
    • @GillBates 啊...我实际上不确定这些是否可以表达,但是自从我编写该代码以来已经很长时间了。是否可以将它们写成 TextFormat(在 {} 大括号中)?
    • @GillBates 根据文档here,其语法为: message Bar { optional int32 a = 1 [(foo_options).opt1 = 123, (foo_options).opt2 = "baz"] ; // 替代聚合语法(使用 TextFormat): op​​tional int32 b = 2 [(foo_options) = { opt1: 123 opt2: "baz" }]; }
    • @danbars,哇,替代语法确实有效!是在哪里描述的?我在文档中的任何地方都找不到它。
    猜你喜欢
    • 1970-01-01
    • 2022-06-30
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多