Java Protobuf-builder不';不存在吗?

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;

我使用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();
现在让我们假设我从一个流中读取该对象(工作正常),现在我想更新电子邮件:

这个例子说:

因此,我尝试获取电子邮件生成器,但我只看到以下内容:

问题


我如何编辑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()