java - Protobuf - 构建器不存在?

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

问题

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

最佳答案

电子邮件未定义为原型(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/

相关文章:

java - 将 protobuf 消息转换为 Java 中的字符串以实现持久性

python - 从 C 和 Python 解析用户定义的协议(protocol)

带有 Id 的 Java Android ArrayList

java - MRUnit reducer 测试: Mismatch in value class

java - 实际参数不能通过方法调用转换来转换

c++ - 如何将重复的字段部分合并到消息中?

python - 使用 pybind11 从 C++ 反序列化 Python 中的 protobuf 缓冲区

ios - Protocol buffer 代码针对 iOS 模拟器进行编译,但不适用于设备

java - 运行 Jenkins 构建时获取异常字段 - $jacocoData 异常

java - 访问已安装认证签名