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

时间:2015-07-22 22:00:09

标签: java protocol-buffers builder

我想知道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);
}

但对于&#34; MsgB b&#34;,相同的代码抛出&#34; UnsupportedOperationException:在非消息类型上调用getFieldBuilder()。&#34;

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

感谢您的任何意见。

1 个答案:

答案 0 :(得分:5)

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

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());