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类型上调用."
我理解重复字段是一个列表,我可以分别设置每个字段.但是,我如何首先获得建筑商?是否有一种干净简单的方法来做类似的事情?
感谢您的任何意见.
您没有获得重复字段本身的构建器 - 您调用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)