2017-01-30 3 views
0

У меня есть программа на Java. Мне нужно сохранить некоторые значения, поэтому я сделал это:протокол buffer - не может добавить список строк

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 tutorial, и я не знаю, что не так.

Вот код этого исключения http://pastebin.com/kW4Qp96x

Вот файл мой прото http://pastebin.com/exG3NjAm

Можно сказать С.Б., как сохранить этот список Строка?

Edit: Finnaly я пытался сделать это с прото файла только с одним полем:

repeated string genesPrimarySet = 1; 

Я не знаю почему, но это не»работа в этом примере, когда я изменить строку int32, то он работает.

ответ

0

Protobuf соответствует стандарту java Контракт: 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; 
    ... 
} 

В этом случае вам не нужно создавать автономную Builder для primarySet - использовать построитель предоставленного entryParameters строитель:

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