gpt4 book ai didi

java - 处理 protobuffers 中的空值

转载 作者:IT老高 更新时间:2023-10-28 21:02:58 27 4
gpt4 key购买 nike

我正在研究从数据库中获取数据并构造 protobuff 消息的东西。鉴于可以从数据库中为某些字段获取空值的可能性,我将在尝试构造 protobuff 消息时得到空指针异常。从线程 http://code.google.com/p/protobuf/issues/detail?id=57 了解 protobuffs 不支持 null ,我想知道处理抛出 NPE 的唯一其他方法是否是将手动检查插入到与 proto 对应的 java 文件中,如下所示!

message ProtoPerson{
optional string firstName = 1;
optional string lastName = 2;
optional string address1 = 3;
}

ProtoPerson.Builder builder = ProtoPerson.Builder.newBuilder();
if (p.getFirstName() != null) builder.setFirstName(p.getFirstName());
if (p.getLastName() != null) builder.setLastName(p.getLastName());
if (p.getAddress1() != null) builder.setAddress1(p.getAddress1());
...

那么有人可以澄清一下在 protobuff 构建期间是否有任何其他可能的有效方法来处理空值?

最佳答案

免责声明:Google 员工每天都会使用 protobufs 回答。我绝不代表 Google。

  1. 将您的原型(prototype)命名为 Person 而不是 PersonProtoProtoPerson。编译的 protobuf 只是您使用的语言指定的类定义,并进行了一些改进。添加“Proto”是多余的。
  2. 使用 YourMessage.hasYourField() 而不是 YourMessage.getYourField() != null。 protobuf 字符串的默认值是一个空字符串,它 NOT 等于 null。然而,无论您的字段是未设置、清除还是空字符串,.hasYourField() 始终返回 false。见 default values for common protobuf field types .
  3. 您可能已经知道,但我想明确地说:不要以编程方式将 protobuf 字段设置为 null 即使在 protobuf 之外,null causes all sorts of problems .请改用 .clearYourField()
  4. Person.BuilderNOT.newBuilder() 方法。 Person 类可以。像这样理解 Builder 模式:只有当你还没有新的 builder 时,你才能创建它。

重写你的 protobuf:

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

如果 thatPerson 是您创建的人员对象,其属性值可以是空字符串、空格或 null,那么我建议使用 Guava's Strings library :

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

关于java - 处理 protobuffers 中的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21227924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com