Java pb3中 int类型的字段值0怎么判断是未设置值还是设置了值0
- 1. 效果图
- 2. 源码
- 参考
Java pb3对 各种类型的默认值进行序列化时省略了。如int类型的字段为0或者null都会省略,但反序列化都可以序列化为0.
proto3, required 和 optional 已在新语法中删除。
3.12之后又加回来了。
总结
- 尽量缩小需要区分缺失值的地方;
- oneof 和 wrapper 两种办法各有便利,相比较下,更推荐符合正常思维的 wrapper 方案,不推荐奇技淫巧的 oneof 方案;
- 坚持用 hasXxx() 判断是否缺失值,这是 Protobuf 通行方式,不要用 Xxx == null or undefined 来判断,不具备可移植性
1. 效果图
- wrapper Int32 设置默认值0和未设置默认null
- oneof Int32 设置默认值0和未设置默认null
2. 源码
// 法一 版本>=proto3.12
syntax = "proto3";
package tutorial;
option java_multiple_files = true;
option java_package = "com.example.tutorial.protos";
message Foo1 {
int32 bar = 1;
optional int32 baz = 2;
}
// 法二
//syntax = "proto3";
import "google/protobuf/wrappers.proto";
//可以为每个简单类型使用特殊的包装器:
// DoubleValue
// FloatValue
// Int64Value
// UInt64Value
// Int32Value
// UInt32Value
// BoolValue
// StringValue
// BytesValue
message Foo2 {
int32 bar = 1;
google.protobuf.Int32Value baz = 2;
}
// 法三
//syntax = "proto3";
message Foo3 {
int32 bar = 1;
oneof optional_baz {
int32 baz = 2;
}
}
参考
- https://stackoverflow.com/questions/42622015/how-to-define-an-optional-field-in-protobuf-3
- https://stackoverflow.com/questions/31801257/why-required-and-optional-is-removed-in-protocol-buffers-3
- https://developers.google.com/protocol-buffers/docs/proto3#default