我有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然后它工作。
答案 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);
}