Aar*_*esh 35 java null protocol-buffers
我正在研究从数据库中获取数据并构造protobuff消息的东西.鉴于可以从数据库中为某些字段提取空值,我将在尝试构造protobuff消息时获得Null指针异常.从线程http://code.google.com/p/protobuf/issues/detail?id=57中的protobuffs中不支持知道null ,我想知道处理NPE的唯一其他方法是抛出是将手动检查插入到与原型相对应的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());
...
Run Code Online (Sandbox Code Playgroud)
那么有人可以澄清在protobuff构造期间是否还有其他可行的有效方法来处理空值?
Mic*_*Sun 42
免责声明:每天使用protobufs从Google播放器中回答.我决不以任何方式代表谷歌.
Person而不是PersonProto或ProtoPerson.编译的protobufs只是您正在使用的语言指定的类定义,并有一些改进.添加"Proto"是额外的冗长.YourMessage.hasYourField()而不是YourMessage.getYourField() != null.对于protobuf的字符串缺省值是一个空字符串,这确实不等于空.然而,无论您的字段是未设置或清除还是空字符串,.hasYourField()始终返回false.请参阅常用protobuf字段类型的默认值.null.即使对于protobuf之外,也会null 引起各种各样的问题.请.clearYourField()改用.Person.Builder类不不有.newBuilder()方法.Person上课.像这样理解Builder模式:只有在没有它的情况下才创建新的构建器.重写你的protobuf:
message Person {
optional firstName = 1;
optional lastName = 2;
optional address1 = 3;
}
Run Code Online (Sandbox Code Playgroud)
重写你的逻辑:
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();
Run Code Online (Sandbox Code Playgroud)
如果thatPerson你创建的人物对象的属性值可以是空字符串,空格或空,那么我建议使用Guava的Strings库:
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();
Run Code Online (Sandbox Code Playgroud)
Ser*_*-Tm 27
wrappers.proto 支持可空值:
例子
syntax = "proto3";
import "google/protobuf/wrappers.proto";
message ProtoPerson {
google.protobuf.StringValue firstName = 1;
google.protobuf.StringValue lastName = 2;
google.protobuf.StringValue address1 = 3;
google.protobuf.Int32Value age = 4;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32246 次 |
| 最近记录: |