Let's say that I have a proto3 message defined as follows, for use as a gRPC request (i.e. using protobuf's binary encoding):
message MyRequest {
string name = 1;
}
Can I change my server (i.e. the reader of the message) to use the following definition without breaking wire compatibility for existing clients (i.e. writers)?
message MyRequest {
repeated string names = 1;
}
In the proto2 language guide, I see the following:
optional
is compatible withrepeated
. Given serialized data of a repeated field as input, clients that expect this field to beoptional
will take the last input value if it's a primitive type field or merge all input elements if it's a message type field.
However, the proto3 documentation does not contain an equivalent statement. I think that this may be related to the use of the packed
encoding for repeated fields in proto3.
You don't need the optional modifier, and it looks like it is confusing the parser. A repeated field is inherently optional : you just don't add any values. As for com.
One of selling points of Protobuf was backward compatibility, i.e. developers can evolve format, and older clients can still use it. Now with new Protobuf version called proto3, the IDL language itself is not compatible as such things as options , required where dropped, new syntax for enuns, no extention.
Yes, repeated fields retain the order of items.
We have seen production issues caused by this multiple times and it's pretty much banned everywhere inside Google for anyone to add/remove required fields. For this reason we completely removed required fields in proto3. After the removal of "required", "optional" is just redundant so we removed "optional" as well.
Yes, this is possible as the binary encoding for an optional string
and for a repeated string
with a single element are the same. However, this change may be confusing to readers of the code because it is not immediately obvious that a message can be reinterpreted in this way.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With