I need to specify a message with an optional field in protobuf (proto3 syntax). In terms of proto 2 syntax, the message I want to express is something like:
message Foo {
required int32 bar = 1;
optional int32 baz = 2;
}
From my understanding "optional" concept has been removed from syntax proto 3 (along with required concept). Though it is not clear the alternative - using the default value to state that a field has not been specified from the sender, leaves an ambiguity if the default value belongs to the valid values domain (consider for example a boolean type).
So, how am I supposed to encode the message above? Thank you.
Since protobuf release 3.15, proto3 supports using the
optionalkeyword (just as in proto2) to give a scalar field presence information.A
has_baz()/hasBaz()method is generated for theoptionalfield above, just as it was in proto2.Under the hood, protoc effectively treats an
optionalfield as if it were declared using aoneofwrapper, as CyberSnoopy’s answer suggested:If you’ve already used that approach, you can now simplify your message declarations (switch from
oneoftooptional) and code, since the wire format is the same.The nitty-gritty details about field presence and
optionalin proto3 can be found in the Application note: Field presence doc.Historical note: Experimental support for
optionalin proto3 was first announced on Apr 23, 2020 in this comment. Using it required passing protoc the--experimental_allow_proto3_optionalflag in releases 3.12-3.14.