替换 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();
我已经成功构建了以下 .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();