我正在使用 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说:
所以我尝试获取电子邮件生成器,但我只看到了这个:
问题
我如何编辑我的这个人,为什么确切的代码不起作用?
最佳答案
电子邮件未定义为原型(prototype)文件中的子消息,而是一个字符串。
Protoc
将消息生成为 java 类,每个生成的类都有一个 Builder
子类,该子类扩展 com.google.protobuf.GenerateMessage.Builder
并实现所有必要的工作方法,并且可以通过适当的 getter 访问构建器。
这就是您无法获取 PhoneNumber 构建器的原因
john.toBuilder().getPhoneBuilder(index);
并设置PhoneNumber字段,因为定义为子消息并且有自己的Builder
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
并且您无法获取电子邮件构建器,因为电子邮件不作为消息子类存在(具有自己的构建器),被定义为字符串并且构建器是 Person 类构建器
optional string email = 3;
如果您想更改电子邮件,可以这样做
john.toBuilder().setEmail("jdoe@example.com").buid();
有点困惑,但希望这能有所帮助。
关于java - Protobuf - 构建器不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26781167/