【问题标题】:How to get a protobuf repeated field builder in Java?如何在 Java 中获取 protobuf 重复字段构建器?
【发布时间】:2015-07-22 22:00:08
【问题描述】:

我想将另一种格式的对象转换为 protobuf,知道 protobuf 的描述符。对于常规字段甚至嵌套字段来说,这很容易做到。但是,我遇到了重复字段的问题。

message Foo {
    optional MsgA a = 1;
    repeated MsgB b = 2;
}

对于“MsgA a”,代码 bld.getFieldBuilder(field) 有效:

Foo.Builder bld = Foo.newBuilder();
Descriptors.Descriptor msgDesc = Foo.getDescriptor();
List<Descriptors.FieldDescriptor> fields = msgDesc.getFields();    
for (Descriptors.FieldDescriptor field : fields) {
    Message.Builder subBld = bld.getFieldBuilder(field);
    // set foreign value xyz using subBld
    // subBld.setFleld(subfield1, xyz);
}

但是对于“MsgB b”,相同的代码会抛出“UnsupportedOperationException: getFieldBuilder() 调用非消息类型。”

我理解重复字段是一个列表,我可以单独设置每个字段。但是,我如何首先获得建造者?有没有一种干净简单的方法来做类似的事情?

感谢您的任何意见。

【问题讨论】:

  • 我已经尽我所能回答了,但我并不完全清楚你想要达到什么目的。

标签: java protocol-buffers builder


【解决方案1】:

您不会为重复字段本身获取构建器 - 您调用 Builder.addRepeatedField(field, value) 等。要为重复字段的 type 获取构建器,您可以使用:

Builder builder = bld.newBuilderForField(field)

如果要修改现有值,可以使用Builder.getRepeatedFieldBuilder(field, index)

要创建一个实例开始,你可以使用Builder.newBuilderForField

Message.Builder subBld = bld.newBuilderForField(field);
// Now modify subBld, then...
bld.addRepeatedField(field, subBld.build());

【讨论】:

  • 当然,但是为了构造“值”,我需要先实例化/获取一个 MsgB.Builder。我只知道字段描述符。
  • @Nathan:查看我的编辑 - 我认为应该可以。很久没有用 Java protobuf 反射 API 做过类似的事情了...
  • 乔恩,这行得通。非常感谢!奇怪的是,'get' 不起作用,但 'new' 起作用。
  • 已尝试 +1,但还没有足够的声誉 :) 再次感谢!
  • @scottxiao:我建议您提出一个新问题,说明您尝试过什么以及发生了什么。很久没看 Java protobuf 代码了,但我会尽力而为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多