Protobuf - 建造者不存在?

时间:2014-11-06 13:52:02

标签: 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;

  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说:

enter image description here

所以我试图获得电子邮件构建器,但我只看到这个:

enter image description here

问题

如何编辑myne的这个人,为什么确切的代码不起作用?

1 个答案:

答案 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();

有点困惑,但希望这会有所帮助。