On Thu, Apr 30, 2015 at 12:52 PM, Nikolay Mladenov < [email protected]> wrote:
> I understand it was an intentional design decision, I just fail to > understand the reasoning for it. > I see this statement. > > >>"In proto3, this is an intentional design decision: has_...() methods > go away except for message fields. For oneofs, the idiomatic API pattern is > to use get_oneof_case() to check which field in the oneof is set." > > It is obvious for me that regular non-message fields should not have > has_.. in proto3. > > but for oneof has_... makes perfect sense. > It is still defined because it is convenient for the "internal" code. > > But it is also convenient for other uses, so hiding it is superficial. > > I now have to redefine all such method for my needs and they have exactly > the same definitions as the private members, > but are just a hassle to write/update and use.... > The intention is to make the public API simpler and consistent. As there is already a way to check for field presence for oneof fields, we decide to not provide has_ methods. > > > > > > > On Thu, Apr 30, 2015 at 9:30 AM, Alfred Kwan <[email protected]> wrote: > >> Nikolay, the has_foo being private is actually intentional, see this closed >> issue <https://github.com/google/protobuf/issues/234>. >> >> Alfred >> >> >> On Wednesday, April 29, 2015 at 6:36:59 PM UTC-4, Nikolay Mladenov wrote: >>> >>> I am also evaluating proto2 vs proto3 and even though it seems proto3 >>> should be the way to go I really miss the has_** functionality in proto3. >>> >>> It seems the following proto pattern may be a workaround: >>> >>> message M{ >>> oneof optional_value{ >>> int32 value = 1; >>> } >>> } >>> >>> It does generate value(), set_value(), clear_value() and has_value() >>> methods (C++) but unfortunately the has_value is private. >>> Is there a reason such a useful and short method is declared private (it >>> implementation only uses public functionality as well) >>> >>> >>> >>> On Wednesday, February 11, 2015 at 3:55:03 PM UTC-5, Alfred Kwan wrote: >>>> >>>> Thanks for pointing me to "oneof". I gave it a try and I have two >>>> questions: >>>> 1) I see the has_() being generated for all the fields inside oneof. Is >>>> this kind of has_() function here to stay throughout subsequent V3 >>>> releases? >>>> 2) Since oneof does not allow a repeated field in both V2/3, is there >>>> pro/cons in case I create one extra layer of structure i.e.: >>>> message manyMsg{ // workaround: wrap the repeating message >>>> repeated oneMsg = 1; >>>> } >>>> message unionMsg{ >>>> oneof testOneof{ >>>> manyMsg msg = 1; // doesn't allow repeated >>>> uint32 foo = 2; >>>> } >>>> } >>>> >>>> >>>> >>>> On Sunday, February 8, 2015 at 11:01:04 PM UTC-5, Feng Xiao wrote: >>>>> >>>>> The union types are obsoleted by oneof: >>>>> https://developers.google.com/protocol-buffers/docs/proto#oneof >>>>> >>>>> On Sat, Feb 7, 2015 at 4:53 AM, Alfred Kwan <[email protected]> wrote: >>>>> >>>>>> To implement the has_boo() in 3.0 implies one boolean per each truly >>>>>> optional field, which means additional maintenance is now required, e.g. >>>>>> matching naming scheme for the pool together with the optional struct, >>>>>> also >>>>>> should we group all booleans together or should they sit right next to >>>>>> the >>>>>> to corresponding optional structures... >>>>>> >>>>>> With the uncertainty of how "any" replaces "extensions" plus the >>>>>> removal of has_boo(), it seems like new adopters (I'm one of them) should >>>>>> pick V2 over 3.0. >>>>>> >>>>>> On Wednesday, January 28, 2015 at 3:10:39 PM UTC-5, Feng Xiao wrote: >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Wed Jan 28 2015 at 12:06:21 PM Troy Lee <[email protected]> wrote: >>>>>>> >>>>>>>> Feng, >>>>>>>> >>>>>>>> Version 3 removes presence logic. >>>>>>>> How do we exam whether a field is exist or not? >>>>>>>> >>>>>>> This is no possible for singular primitive fields. For singular >>>>>>> message fields, the has methods will still be generated. Basically with >>>>>>> proto3 you'll need to write your code without depending on these dropped >>>>>>> features. It's believed that most users don't use the field presence >>>>>>> logic >>>>>>> much and for those who need this feature adding a bool field is an easy >>>>>>> workaround. >>>>>>> >>>>>>> >>>>>>>> >>>>>>>> Thanks, >>>>>>>> troylee >>>>>>>> >>>>>>>> Feng Xiao於 2014年12月11日星期四 UTC+8下午12時51分01秒寫道: >>>>>>>> >>>>>>>>> Hi all, >>>>>>>>> >>>>>>>>> I just published protobuf v3.0.0-alpha-1 on our github site: >>>>>>>>> https://github.com/google/protobuf/releases/tag/v3.0.0-alpha-1 >>>>>>>>> >>>>>>>>> This is the first alpha release of protobuf v3.0.0. In protobuf >>>>>>>>> v3.0.0, we will add a new protobuf language version (aka proto3) and >>>>>>>>> support a wider range of programming languages (to name a few: ruby, >>>>>>>>> php, >>>>>>>>> node.js, objective-c). This alpha version contains C++ and Java >>>>>>>>> implementation with partial proto3 support (see below for details). In >>>>>>>>> future releases we will add support for more programming languages and >>>>>>>>> implement the full proto3 feature set. Besides proto3, this alpha >>>>>>>>> version >>>>>>>>> also includes two other new features: map fields and arena >>>>>>>>> allocation. They >>>>>>>>> are implemented for both proto3 and the old protobuf language version >>>>>>>>> (aka >>>>>>>>> proto2). >>>>>>>>> >>>>>>>>> We are currently working on the documentation of these new >>>>>>>>> features and when it's ready it will be updated to our protobuf >>>>>>>>> developer guide >>>>>>>>> <https://developers.google.com/protocol-buffers/docs/overview>. >>>>>>>>> For the time being if you have any questions regarding proto3 or >>>>>>>>> other new >>>>>>>>> features, please post your question in the discussion group. >>>>>>>>> >>>>>>>>> CHANGS >>>>>>>>> ======= >>>>>>>>> Version 3.0.0-alpha-1 (C++/Java): >>>>>>>>> >>>>>>>>> General >>>>>>>>> * Introduced Protocol Buffers language version 3 (aka proto3). >>>>>>>>> >>>>>>>>> When protobuf was initially opensourced it implemented >>>>>>>>> Protocol Buffers >>>>>>>>> language version 2 (aka proto2), which is why the version >>>>>>>>> number >>>>>>>>> started from v2.0.0. From v3.0.0, a new language version >>>>>>>>> (proto3) is >>>>>>>>> introduced while the old version (proto2) will continue to be >>>>>>>>> supported. >>>>>>>>> >>>>>>>>> The main intent of introducing proto3 is to clean up protobuf >>>>>>>>> before >>>>>>>>> pushing the language as the foundation of Google's new API >>>>>>>>> platform. >>>>>>>>> In proto3, the language is simplified, both for ease of use >>>>>>>>> and to >>>>>>>>> make it available in a wider range of programming languages. >>>>>>>>> At the >>>>>>>>> same time a few features are added to better support common >>>>>>>>> idioms >>>>>>>>> found in APIs. >>>>>>>>> >>>>>>>>> The following are the main new features in language version 3: >>>>>>>>> >>>>>>>>> 1. Removal of field presence logic for primitive value >>>>>>>>> fields, removal >>>>>>>>> of required fields, and removal of default values. This >>>>>>>>> makes proto3 >>>>>>>>> significantly easier to implement with open struct >>>>>>>>> representations, >>>>>>>>> as in languages like Android Java, Objective C, or Go. >>>>>>>>> 2. Removal of unknown fields. >>>>>>>>> 3. Removal of extensions, which are instead replaced by a >>>>>>>>> new standard >>>>>>>>> type called Any. >>>>>>>>> 4. Fix semantics for unknown enum values. >>>>>>>>> 5. Addition of maps. >>>>>>>>> 6. Addition of a small set of standard types for >>>>>>>>> representation of time, >>>>>>>>> dynamic data, etc. >>>>>>>>> 7. A well-defined encoding in JSON as an alternative to >>>>>>>>> binary proto >>>>>>>>> encoding. >>>>>>>>> >>>>>>>>> This release (v3.0.0-alpha-1) includes partial proto3 support >>>>>>>>> for C++ and >>>>>>>>> Java. Items 6 (well-known types) and 7 (JSON format) in the >>>>>>>>> above feature >>>>>>>>> list are not implemented. >>>>>>>>> >>>>>>>>> A new notion "syntax" is introduced to specify whether a >>>>>>>>> .proto file >>>>>>>>> uses proto2 or proto3: >>>>>>>>> >>>>>>>>> // foo.proto >>>>>>>>> syntax = "proto3"; >>>>>>>>> message Bar {...} >>>>>>>>> >>>>>>>>> If omitted, the protocol compiler will generate a warning and >>>>>>>>> "proto2" will >>>>>>>>> be used as the default. This warning will be turned into an >>>>>>>>> error in a >>>>>>>>> future release. >>>>>>>>> >>>>>>>>> We recommend that new Protocol Buffers users use proto3. >>>>>>>>> However, we do not >>>>>>>>> generally recommend that existing users migrate from proto2 >>>>>>>>> from proto3 due >>>>>>>>> to API incompatibility, and we will continue to support proto2 >>>>>>>>> for a long >>>>>>>>> time. >>>>>>>>> >>>>>>>>> * Added support for map fields (implemented in C++/Java for both >>>>>>>>> proto2 and >>>>>>>>> proto3). >>>>>>>>> >>>>>>>>> Map fields can be declared using the following syntax: >>>>>>>>> >>>>>>>>> message Foo { >>>>>>>>> map<string, string> values = 1; >>>>>>>>> } >>>>>>>>> >>>>>>>>> Data of a map field will be stored in memory as an unordered >>>>>>>>> map and it >>>>>>>>> can be accessed through generated accessors. >>>>>>>>> >>>>>>>>> C++ >>>>>>>>> * Added arena allocation support (for both proto2 and proto3). >>>>>>>>> >>>>>>>>> Profiling shows memory allocation and deallocation constitutes >>>>>>>>> a significant >>>>>>>>> fraction of CPU-time spent in protobuf code and arena >>>>>>>>> allocation is a >>>>>>>>> technique introduced to reduce this cost. With arena >>>>>>>>> allocation, new >>>>>>>>> objects will be allocated from a large piece of preallocated >>>>>>>>> memory and >>>>>>>>> deallocation of these objects is almost free. Early adoption >>>>>>>>> shows 20% to >>>>>>>>> 50% improvement in some Google binaries. >>>>>>>>> >>>>>>>>> To enable arena support, add the following option to your >>>>>>>>> .proto file: >>>>>>>>> >>>>>>>>> option cc_enable_arenas = true; >>>>>>>>> >>>>>>>>> Protocol compiler will generate additional code to make the >>>>>>>>> generated >>>>>>>>> message classes work with arenas. This does not change the >>>>>>>>> existing API >>>>>>>>> of protobuf messages and does not affect wire format. Your >>>>>>>>> existing code >>>>>>>>> should continue to work after adding this option. In the >>>>>>>>> future we will >>>>>>>>> make this option enabled by default. >>>>>>>>> >>>>>>>>> To actually take advantage of arena allocation, you need to >>>>>>>>> use the arena >>>>>>>>> APIs when creating messages. A quick example of using the >>>>>>>>> arena API: >>>>>>>>> >>>>>>>>> { >>>>>>>>> google::protobuf::Arena arena; >>>>>>>>> // Allocate a protobuf message in the arena. >>>>>>>>> MyMessage* message = Arena::CreateMessage<MyMessage >>>>>>>>> >(&arena); >>>>>>>>> // All submessages will be allocated in the same arena. >>>>>>>>> if (!message->ParseFromString(data)) { >>>>>>>>> // Deal with malformed input data. >>>>>>>>> } >>>>>>>>> // Must not delete the message here. It will be deleted >>>>>>>>> automatically >>>>>>>>> // when the arena is destroyed. >>>>>>>>> } >>>>>>>>> >>>>>>>>> Currently arena does not work with map fields. Enabling arena >>>>>>>>> in a .proto >>>>>>>>> file containing map fields will result in compile errors in >>>>>>>>> the generated >>>>>>>>> code. This will be addressed in a future release. >>>>>>>>> ======= >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Feng >>>>>>>>> >>>>>>>> -- >>>>>>>> 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 http://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 http://groups.google.com/group/protobuf. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "Protocol Buffers" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/protobuf/ZRpcfmeGK6s/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at http://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 http://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 http://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.
