On Wednesday, May 18, 2016 at 11:32:03 AM UTC-7, Feng Xiao wrote:
>
>
>
> On Tue, May 17, 2016 at 7:53 PM, Teddy Zhang <[email protected] 
> <javascript:>> 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 
> <https://github.com/google/protobuf/blob/master/src/google/protobuf/wrappers.proto#L84>.
>  
> In proto3, message fields still have has-bits.
>
Wrapper field consumes more space. Also, the wire format is not compatible 
when move from proto2 to proto3 (given the schema needs to change).
 

> 2. Use an oneof. For example:
> message Test1 {
>   oneof a_oneof {
>     int32 a = 1;
>   }
> }
> then you can check test.getAOneofCase().
>
Same issue as above. 


>
>> Can we add the functionality back?
>>
> It's very unlikely to happen as proto3 features are already finalized and 
> implemented in many languages.
>
Is it possible to add a option on message to control this?
I know proto3 is probably in last beta and try to avoid big changes. 
However, remove support for this creates a lot of pain in a big 
system which already leverage this feature, and may move many people away.

>  
>
>>
>>
>> On Saturday, March 26, 2016 at 11:47:08 AM UTC-7, Ilia Mirkin wrote:
>>
>>> Use proto2, which has the has_* checks per field. (Using get_* you 
>>> still get the default value, of course.) It's extremely unfortunate 
>>> that this functionality was removed in proto3, I see that making 
>>> proto3 unattractive for all but the simplest uses of protos. I know in 
>>> almost every protobuf use-case I've had, the presence accessors were 
>>> imperative to proper operation. 
>>>
>>> On Sat, Mar 26, 2016 at 2:43 PM, Yoav H <[email protected]> wrote: 
>>> > Hi, 
>>> > 
>>> > I wanted ask regarding the decision to populate fields with default 
>>> values, 
>>> > even if they do not appear in the encoded message. 
>>> > If I want to send a "patch" message, where I want to update just the 
>>> > provided fields, how can I do that with protobuf (without adding 
>>> IsXXXSet 
>>> > for every field)? 
>>> > 
>>> > Why not add another type, representing a default value? 
>>> > So the schematics would be, if the field is missing, it is null, and 
>>> if the 
>>> > field exists, but with this "missing value" type, it will get the 
>>> default 
>>> > value? 
>>> > 
>>> > Thanks, 
>>> > Yoav. 
>>> > 
>>> > -- 
>>> > You received this message because you are subscribed to the Google 
>>> Groups 
>>> > "Protocol Buffers" group. 
>>> > To unsubscribe from this group and stop receiving emails from it, send 
>>> an 
>>> > email to [email protected]. 
>>> > To post to this group, send email to [email protected]. 
>>> > Visit this group at https://groups.google.com/group/protobuf. 
>>> > For more options, visit https://groups.google.com/d/optout. 
>>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Protocol Buffers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/protobuf.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to