Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中获得protobuf重复字段生成器?_Java_Protocol Buffers_Builder - Fatal编程技术网

如何在Java中获得protobuf重复字段生成器?

如何在Java中获得protobuf重复字段生成器?,java,protocol-buffers,builder,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(); 描述符msgDesc=Foo.getDescripto

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

message Foo {
    optional MsgA a = 1;
    repeated MsgB b = 2;
}
对于“MsgA a”,代码bld.getFieldBuilder(field)起作用:

Foo.Builder bld=Foo.newBuilder();
描述符msgDesc=Foo.getDescriptor();
List fields=msgDesc.getFields();
for(描述符。字段描述符字段:字段){
Message.Builder subBld=bld.getFieldBuilder(字段);
//使用子BLD设置外部值xyz
//子字段setFleld(子字段1,xyz);
}
但是对于“MsgB b”,相同的代码抛出“UnsupportedOperationException:对非消息类型调用的getFieldBuilder()

我知道重复字段是一个列表,我可以分别设置每个字段。但是,我怎样才能先找到一个建筑商呢?有没有一个干净简单的方法来做类似的事情


感谢您的任何输入。

您无法获得重复字段本身的生成器-您可以调用
builder.addRepeatedField(字段,值)
等。要获得重复字段类型的生成器,您可以使用:

Builder builder = bld.newBuilderForField(field)
如果要修改现有值,可以使用
Builder.getRepeatedFieldBuilder(字段,索引)

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

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

我已经尽我所能回答了,但我并不完全清楚您想要实现什么。当然,但为了构造“值”,我需要首先实例化/获取一个MsgB.Builder。我只知道字段描述符。@Nathan:请看我的编辑-我想应该可以。我已经很久没有用Java protobuf反射API做过类似的事情了……Jon,这很有效。谢谢!奇怪,“get”不起作用,但“new”起作用。尝试+1,但还没有足够的声誉:)再次感谢@斯科特肖:我建议你问一个新问题,说明你做了什么,发生了什么。我已经很久没有看过Java protobuf代码了,但我会尽我所能。
Message.Builder subBld = bld.newBuilderForField(field);
// Now modify subBld, then...
bld.addRepeatedField(field, subBld.build());