免责声明:Google 员工每天使用 protobufs 回答。我绝不是以任何方式代表谷歌。
- 将原型命名为 或 。编译的 protobufs 只是由您正在使用的语言指定的类定义,并进行了一些改进。添加“Proto”是额外的冗长。
Person
PersonProto
ProtoPerson
- 请代替 使用 。protobuf 字符串的默认值为空字符串,不等于 null。然而,无论您的字段是未设置的、已清除的还是空字符串,始终返回 false。请参阅常见原型词字段类型的默认值。
YourMessage.hasYourField()
YourMessage.getYourField() != null
.hasYourField()
- 您可能已经知道,但我想明确地说:不要以编程方式将 protobuf 字段设置为
null
。即使对于原型之外,也会导致各种问题。请改用。null
.clearYourField()
-
Person.Builder
类没有方法。 类确实如此。像这样理解生成器模式:仅当还没有新的生成器时,才创建新的生成器。.newBuilder()
Person
重写您的原型:
message Person {
optional string first_name = 1;
optional string last_name = 2;
optional string address_1 = 3;
}
重写您的逻辑:
Person thatPerson = Person.newBuilder()
.setFirstName("Aaa")
.setLastName("Bbb")
.setAddress1("Ccc")
.build();
Person.Builder thisPersonBuilder = Person.newBuilder()
if (thatPerson.hasFirstName()) {
thisPersonBuilder.setFirstName(thatPerson.getFirstName());
}
if (thatPerson.hasLastName()) {
thisPersonBuilder.setLastName(thatPerson.getLastName());
}
if (thatPerson.hasAddress1()) {
thisPersonBuilder.setAddress1(thatPerson.getAddress1());
}
Person thisPerson = thisPersonBuilder.build();
如果您创建的 person 对象的属性值可以是空字符串、空格或 null,那么我建议使用 Guava 的 Strings
库:thatPerson
import static com.google.common.base.Strings.nullToEmpty;
Person.Builder thisPersonBuilder = Person.newBuilder()
if (!nullToEmpty(thatPerson.getFirstName()).trim().isEmpty()) {
thisPersonBuilder.setFirstName(thatPerson.getFirstName());
}
if (!nullToEmpty(thatPerson.hasLastName()).trim().isEmpty()) {
thisPersonBuilder.setLastName(thatPerson.getLastName());
}
if (!nullToEmpty(thatPerson.hasAddress1()).trim().isEmpty()) {
thisPersonBuilder.setAddress1(thatPerson.getAddress1());
}
Person thisPerson = thisPersonBuilder.build();