问题描述
我正在使用ProtoBuffer 3,并且有一条消息由多个字段组成,其中一些是其他消息,其中包含一些(或所有)可为空的值。
例如:
message MainMessage {
google.protobuf.StringValue title = 1;
NotNullable sub1 = 2;
Nullable sub2 = 3;
NotNullable sub3 = 4;
}
message NotNullable {
int64 id = 1;
string value = 2;
}
message Nullable {
google.protobuf.Int64Value id = 1;
google.protobuf.Int64Value value = 2;
}
我正在收到儿子的消息,我想使用以下代码反序列化它:
String json = "{\"title\":{\"value\":\"A nice title\"},\"sub1\":{\"id\":{\"value\":1}}}";
MainMessage.Builder message = MainMessage.newBuilder();
JsonFormat.parser().merge(json,message);
在要获取的对象上方运行代码后,包含所有字段(即使sub2
和sub3
不在JSON中),其中所有缺失的数据都将初始化为默认值
例如,以下代码将返回true:
assertTrue(message.getSub2().getId().isInitialized())
assertTrue(message.getSub3().isInitialized())
我检查了文档,但找不到一种方法来告诉解析器不要设置这些字段-有这样的选择吗?
解决方法
这篇文章似乎解决了这个问题:https://itnext.io/protobuf-and-null-support-1908a15311b6
我的实现方式如下(对名称的混淆,很抱歉-我想保留原始名称):
message MainMessage {
google.protobuf.StringValue title = 1;
NotNullable sub1 = 2;
Nullable sub2 = 3;
NotNullable sub3 = 4;
}
message NotNullable {
int64 id = 1;
string value = 2;
}
message Nullable {
google.protobuf.Int64Value id = 1;
google.protobuf.Int64Value value = 2;
}
message AllowNullable {
oneof kind {
google.protobuf.NullValue null = 1;
Nullable value = 2;
}
现在所需要做的就是在调用值以检查其是否为空之前使用has
方法
例如:
if(message.getSub3().hasValue()) {
// do something...
}