【发布时间】:2021-06-30 22:05:26
【问题描述】:
有人解释一下如何在 google protobuf 中处理空值。
我有这样的结构:
syntax = "proto3";
import "google/protobuf/wrappers.proto";
message Person {
google.protobuf.DoubleValue age = 4;
}
和java代码:
DoubleValue myAge = null;
Person build = Person.newBuilder()
.setAge(myAge) // <- NPE
.build();
此代码导致.setAge(myAge) 行出现空指针异常。
那么 protobuf DoubleValue 的用例是什么?我以为它是用来管理空值的。但仍然收到 NullPointerException 。
你使用这样的代码来处理这个问题吗?
DoubleValue a = null;
Person.Builder builder = Person.newBuilder();
if (a != null) {
builder.setAge(a);
}
Person build = builder.build();
更新:
这是 protoc 命令生成的代码的一部分:
/**
* <code>.google.protobuf.DoubleValue age = 9;</code>
*/
public Builder setAge(com.google.protobuf.DoubleValue value) {
if (ageBuilder_ == null) {
if (value == null) { //<-- Additional statement
throw new NullPointerException();
}
age_ = value;
onChanged();
} else {
ageBuilder_.setMessage(value);
}
为什么要在生成的代码中设置额外的if 语句?
我认为这是 google 协议缓冲区的错误。
最后我写了这段代码:
DoubleValue.Builder builder = DoubleValue.newBuilder();
DoubleValue myAge = null;
Person build = Person.newBuilder()
.setAge(myAge != null ? myAge : builder )
.build();
【问题讨论】:
-
您是否尝试过在您的原型架构中使用
optional? -
我使用 proto3 ,默认情况下所有字段都是可选的。 (不需要)
-
如果是这种情况,教程需要更新developers.google.com/protocol-buffers/docs/javatutorial
-
是的,您在那里编写的代码是如何使用 Protos 正确处理此问题的。
标签: java protocol-buffers