如何在Java中获得protobuf重复的字段构建器?

Nat*_*n W 3 java builder protocol-buffers

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

message Foo {
    optional MsgA a = 1;
    repeated MsgB b = 2;
}
Run Code Online (Sandbox Code Playgroud)

对于"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);
}
Run Code Online (Sandbox Code Playgroud)

但对于"MsgB b",相同的代码抛出"UnsupportedOperationException:getFieldBuilder()在非Message类型上调用."

我理解重复字段是一个列表,我可以分别设置每个字段.但是,我如何首先获得建筑商?是否有一种干净简单的方法来做类似的事情?

感谢您的任何意见.

Jon*_*eet 5

您没有获得重复字段本身的构建器 - 您调用Builder.addRepeatedField(field, value)等.要获取重复字段类型的构建器,您可以使用:

Builder builder = bld.newBuilderForField(field)
Run Code Online (Sandbox Code Playgroud)

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

要创建要开始的实例,您可以使用Builder.newBuilderForField:

Message.Builder subBld = bld.newBuilderForField(field);
// Now modify subBld, then...
bld.addRepeatedField(field, subBld.build());
Run Code Online (Sandbox Code Playgroud)