我想知道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;
我理解重复字段是一个列表,我可以单独设置每个字段。但是,我如何首先获得建筑商?是否有一种干净简单的方法来做类似的事情?
感谢您的任何意见。
答案 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());