Support fields ids as keys in plain objects #1170
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR is an adaptation of the Closure Library's KeyOption provided by goog.proto2.ObjectSerializer
It allows to read, produce and verify a plain object using its fields ids as keys.
Unlike Closure Library, by default the names of the fields are used. To use the ids, it is necessary to specify it with an optional boolean parameter.
We use the ids of the fields in our payloads to reduce their size and pseudo-obfuscate the data.
We would like to accomplish the same with dcodeio/protobuf.js.
With the message
We can create this plain object
Or this one by using
root.lookupType("MyMessage").toObject(obj, {useId: true})
:We can still convert
{"foo": "value", "bar": 15}
into a valid MyMessage message usingroot.lookupType("MyMessage").fromObject(obj)
We can also convert
{"1": "value", "2": 15}
into a valid MyMessage message usingroot.lookupType("MyMessage").fromObject(obj, true)
.The fields names are resolved during the conversion.
Finally, we can verify a plain object with ids as keys by using
root.lookupType("MyMessage").verify({"1": "value", "2": 15}, true)
.Like before, the message instances continue to use the fields names.
There is no breaking change : if no extra parameter is specified, the conversions continue to use the fields names.