I'm really not happy to see that proto3 removed the ability in generate code for check whether a field exits or not.For a message like this:message Test1 {
required int32 a = 1;
}If field a is present, the encoded message will have field with id 1 and its value. If the field is not set, the encoded message will not have field id 1.In proto2 generated code, it provides a has method to check whether the field exists or not.In proto3, this is no such thing. During deserialization, if the field is not exists, default value is set. So you can't tell whether the field does not exist or have a default value. That doesn't match the underline encoding anymore.This is a breaking change and will portentially impact a lot of people. Basically we're losing nullable support.For our project, we heavily depends on that. There are workarounds (add a Boolean field) but it is ugly. I think that will stop us from moving from proto2 to proto3 (may need find alternatives).
Can we add the functionality back?
On Tue, May 17, 2016 at 7:53 PM, Teddy Zhang <losti...@gmail.com> wrote:I'm really not happy to see that proto3 removed the ability in generate code for check whether a field exits or not.For a message like this:message Test1 {
required int32 a = 1;
}If field a is present, the encoded message will have field with id 1 and its value. If the field is not set, the encoded message will not have field id 1.In proto2 generated code, it provides a has method to check whether the field exists or not.In proto3, this is no such thing. During deserialization, if the field is not exists, default value is set. So you can't tell whether the field does not exist or have a default value. That doesn't match the underline encoding anymore.This is a breaking change and will portentially impact a lot of people. Basically we're losing nullable support.For our project, we heavily depends on that. There are workarounds (add a Boolean field) but it is ugly. I think that will stop us from moving from proto2 to proto3 (may need find alternatives).There are two workarounds to get back the field presence info in proto3.1. Use a wrapper message, such as google.protobuf.Int32Value. In proto3, message fields still have has-bits.
2. Use an oneof. For example:message Test1 {oneof a_oneof {int32 a = 1;}}then you can check test.getAOneofCase().
Can we add the functionality back?It's very unlikely to happen as proto3 features are already finalized and implemented in many languages.