Java Protobuf-builder不';不存在吗?
我使用protobuf示例(对于C#和java):Java Protobuf-builder不';不存在吗?,java,protocol-buffers,Java,Protocol Buffers,我使用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;
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();
现在让我们假设我从一个流中读取该对象(工作正常),现在我想更新电子邮件:
这个例子说:
因此,我尝试获取电子邮件生成器,但我只看到以下内容:
问题
我如何编辑myne的这个人,为什么确切的代码不起作用 电子邮件在您的原始文件中没有定义为子消息,而是一个字符串
Protoc
将消息生成为java类,每个生成的类都有一个Builder
子类,该子类扩展com.google.protobuf.GeneratedMessage.Builder
,并实现所有必要的工作方法,并且可以通过适当的getter访问该生成器
这就是你无法获得电话号码生成器的原因
john.toBuilder().getPhoneBuilder(index);
并设置PhoneNumber字段,因为它被定义为子消息,并且有自己的生成器
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
您无法获取电子邮件生成器,因为电子邮件不作为消息子类(使用其自己的生成器)存在,它被定义为字符串,并且生成器是Person类生成器
optional string email = 3;
如果你想更改电子邮件,你可以这样做
john.toBuilder().setEmail("jdoe@example.com").buid();
有点困惑,但希望这能有所帮助。根据我的测试,应该是
john=john.toBuilder().setEmail(“jdoe@example.com“”。build()