我正在使用protobuf示例(对于C#和java):
proto
文件
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
我已经有一个Person
对象:
Person john = Person
.newBuilder()
.setId(1234)
.setName("John Doe")
.setEmail("jdoe@example.com")
.addPhone(
Person.PhoneNumber.newBuilder().setNumber("555-4321")
.setType(Person.PhoneType.HOME)).build();
现在让我们假设我已从流中读取该对象(正常工作),现在我想更新电子邮件:
示例here说:
所以我试图获得电子邮件构建器,但我只看到这个:
问题
如何编辑myne的这个人,为什么确切的代码不起作用?
答案 0 :(得分:1)
电子邮件未在proto文件中定义为子邮件,是一个字符串。
Protoc
生成消息作为java类,每个生成的类都有一个Builder
子类,扩展com.google.protobuf.GeneratedMessage.Builder
并实现所有必要的方法,并且可以通过适当的getter访问构建器
这就是你无法获得PhoneNumber构建器的原因
john.toBuilder().getPhoneBuilder(index);
并设置PhoneNumber字段,因为它被定义为子消息并具有自己的Builder
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
并且您无法获取电子邮件Builder,因为电子邮件不存在作为消息子类(使用自己的构建器),被定义为String,构建器是Person Person构建器
optional string email = 3;
如果您想更改电子邮件,可以
john.toBuilder().setEmail("jdoe@example.com").buid();
有点困惑,但希望这会有所帮助。