2016-02-21 2 views
0

Я успешно построил следующий .proto файл:Замена строки в Google протокола буферов данных

package JervisStorage; 

option java_package = "TextBase"; 
option java_outer_classname = "JervisStorage"; 

message Owner { 
    optional string name = 1; 
    optional string sex = 2; 
    optional string profession = 3; 
    optional string email = 4; 
} 

Теперь, мне удалось построить Владелец:

private static Owner owner; 
private static FileOutputStream serialOutput; 

Owner pusheen= Owner.newBuilder() 
       .setName("Siema") 
       .setSex(" ") 
       .setProfession(" ") 
       .setEmail(" ") 
       .build(); 

Я написал объект файл и успешно прочитать объект из файла:

serialOutput = new FileOutputStream("JervisStorage.ser"); 
pusheen.writeTo(serialOutput); 
serialOutput.close(); 

owner = Owner.parseFrom(new FileInputStream("JervisStorage.ser")); 
System.out.println(owner.getName()); 

Проблема заключается в том, что я не могу заменить запись с подписью, wr вернемся к файлу и прочитаем весь обновленный объект. Я пытался это сделать:

owner.toBuilder().setName("newName").build(); 
System.out.println(owner.getName()); 
serialOutput = new FileOutputStream("JervisStorage.ser"); 
owner.writeTo(serialOutput); 
serialOutput.close(); 

owner = Owner.parseFrom(new FileInputStream("JervisStorage.ser")); 
System.out.println(owner.getName()); 

К сожалению, этот подход, похоже, не работает ... Может ли кто-нибудь помочь?

+0

Когда вы говорите 'owner.toBuilder()', он создает строитель, но он * не * мутировать существующий объект , Вам нужно назначить результат вызова build(), поскольку это новый экземпляр. Подумайте о неизменных типах. См. Раздел «Строители» на странице https://developers.google.com/protocol-buffers/docs/reference/java-generated. – dyoo

ответ

1

почему бы не сделать

editedOwner = Owner.newBuilder() 
          .mergeFrom(new FileInputStream("JervisStorage.ser")) 
          .setName("new name") 
          .build(); 

в качестве альтернативы вы можете сделать

editedOwner = owner.toBuilder() 
        .setName("new name") 
        .build(); 
+0

Нет способа .mergerFrom, возможно, моя библиотека устарела. Я попробовал второй подход, посмотрите выше. – Nytorian

+0

К сожалению, набрав ошибку, должно быть mergeFrom и ни слияние. Я обновил свой ответ –

+0

Первое предложение работает, мне оно нравится. Большое спасибо Брюсу :) – Nytorian

0

Хорошо, мне удалось найти решение этой проблемы. Я ненавижу продлить время вычисления, когда это ненужно, но это лучшее, что я могу додумать до сих пор. У меня есть два объекта Владелец: и editedOwner:

Owner owner;//for reading the records from the file 
Owner editedOwner;// for addidng to the file 

owner = Owner.parseFrom(new FileInputStream("JervisStorage.ser")); 

editedOwner = Owner.newBuilder() 
          .setName("new name") 
          .setSex(owner.getSex()) 
          .setProfession(owner.getProfession()) 
          .setEmail(owner.getEmail()) 
          .build(); 

serialOutput = new FileOutputStream("JervisStorage.ser"); 
editedOwner.writeTo(serialOutput); 
serialOutput.close(); 

К счастью, этот маленький грязный подход решает мою проблему сейчас. Спасибо.

Смежные вопросы