如何在构建消息之前在 protobuf 中设置重复字段?

Posted

技术标签:

【中文标题】如何在构建消息之前在 protobuf 中设置重复字段?【英文标题】:How to set repeated fields in protobuf before building the message? 【发布时间】:2015-03-20 15:28:47 【问题描述】:

假设我有一个包含重复字段的消息:

Message Foo 
    repeated Bar bar = 1;

现在我想将nBar 对象插入到字段栏中,每个对象都是在循环中创建的。

for (i=0; i < n; i++)
    //Add Bar into foo

//Build foo after loop

这可能吗,还是在构建 foo 对象之前我需要所有 n bar 字段?

【问题讨论】:

【参考方案1】:

当您使用 protoc 命令生成 java 对象时,它将创建一个 Foo 对象,该对象将具有自己的构建器方法。

你最终会做这样的事情

//Creates the builder object 
Builder builder = Package.Foo.newBuilder();
//populate the repeated field.
builder.addAll(new ArrayList<Bar>());
//This should build out a Foo object
builder.build(); 

要添加单个对象,您可以执行以下操作。

    Bar bar = new Bar();
    builder.addBar(bar);
    builder.build();

根据您要求的用例进行编辑。

【讨论】:

是的,这就是我现在所做的,但我希望能找到可以一个一个插入内部对象的东西。 编辑了消息,应该有一个选项可以一一传入各个对象。 单线如何做到这一点?【参考方案2】:
List<Bar> barList= new Arraylist();
barList.add(new Bar());

然后在 Foo 中设置 Bar 的列表

Foo foo =  Foo.newBuilder()
        .addAllBar(barList)
        .build;

Bar 只能设置一个值

Foo foo =  Foo.newBuilder()
        .addBar(new Bar())
        .build;

【讨论】:

以上是关于如何在构建消息之前在 protobuf 中设置重复字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在protobuf中设置重复字段至少重复一次

如何在spring集成消息中设置JMS Header

如何在 Azure devops 中设置构建管道 [关闭]

在 Html Textarea 中设置 maxlength [重复]

Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]

在存储过程中设置 RAISERROR 的编号和消息