协议缓冲区 - 无法添加字符串列表

时间:2017-01-30 21:54:05

标签: java protocol-buffers

我有Java程序。我需要保存一些值,所以我这样做了:

Parameters.entryParameters.Builder parameters = Parameters.entryParameters.newBuilder();

        parameters.setMaxNumberOfRules(maxNumberOfRules);
        parameters.setMaxPValue(maxPValue);
        parameters.setMaxRuleLength(maxRuleLength);
        parameters.setMinimumSupport(minimumSupport);

和那项工作。在下一行我做了这个:

for(int i = 0; i < genesOfPrimarySet.size(); i++) { 
                Parameters.entryParameters.primarySet.Builder primarySet =
                        Parameters.entryParameters.primarySet.newBuilder().setGenesOfPrimarySet(i, genesOfPrimarySet.get(i));
            }

此列表的声明List<String> genesOfPrimarySet

因此,当我想保存此列表时,我得到了例外。我在官方的java教程协议缓冲区上写了这个基础,我不知道出了什么问题。

以下是此异常的代码http://pastebin.com/kW4Qp96x

这是我的原型文件http://pastebin.com/exG3NjAm

可以告诉我如何保存这个字符串列表吗?

编辑:Finnaly我试图用proto文件只用一个字段来创建它:

repeated string genesPrimarySet = 1;

我不知道为什么,但它没有&#39;在这个例子中工作,当我将字符串更改为int32然后它工作。

1 个答案:

答案 0 :(得分:0)

Protobuf遵循标准的java List契约:setXXX()方法替换给定位置的元素。因为最初列表的长度为空,所以抛出IndexOutOfBoundsException。要附加元素,您需要使用addXXX()方法:

Parameters.entryParameters.primarySet.Builder primarySet = 
    Parameters.entryParameters.primarySet.newBuilder();
for (int i = 0; i < genesOfPrimarySet.size(); i++) { 
    primarySet.addGenesOfPrimarySet(genesOfPrimarySet.get(i));
}

尽管这可以修复错误,但我怀疑您是否想要创建一个独立的primarySet消息。我相信您希望将primarySet作为entryParameters消息的字段包含在内:

message entryParameters {
  message primarySet {
    repeated string genesOfPrimarySet = 1;
  }

  required int32 maxRuleLength = 1;
  required int32 minimumSupport = 2;
  required double maxPValue = 3;
  required int32 maxNumberOfRules = 4;
  required primarySet genes = 5;
  ...
}

在这种情况下,您无需为primarySet创建独立构建器 - 您使用entryParameters构建器提供的构建器:

...
for (int i = 0; i < genesOfPrimarySet.size(); i++) {
  parameters.getGenesBuilder().addGenesOfPrimarySet(genesOfPrimarySet.get(i);
}