替换 Google 协议数据缓冲区中的字符串

Replacing a string in Google Protocol Data Buffers

我已经成功构建了以下 .proto 文件:

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());

问题是我无法替换单个记录,将其写回文件并读取整个更新的对象。我一直在尝试这样做:

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());

不幸的是,这种方法似乎不起作用...有人可以帮忙吗?

好的,我设法找到了解决这个问题的方法。我讨厌在不必要的时候延长计算时间,但这是迄今为止我能想到的最好的。我有两个 Owner 对象:owner 和 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();

幸运的是,这个有点麻烦的方法暂时解决了我的问题。谢谢。

为什么不做

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

或者你可以做

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