Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libserialize: tuple-arity should be provided to Decoder::read_tuple #17595

Merged
merged 2 commits into from
Nov 2, 2014

Conversation

danburkert
Copy link
Contributor

Currently Decoder implementations are not provided the tuple arity as
a parameter to read_tuple. This forces all encoder/decoder combos to
serialize the arity along with the elements. Tuple-arity is always known
statically at the decode site, because it is part of the type of the
tuple, so it could instead be provided as an argument to read_tuple,
as it is to read_struct.

The upside to this is that serialized tuples could become smaller in
encoder/decoder implementations which choose not to serialize type
(arity) information. For example, @TyOverby's
binary-encode format is
currently forced to serialize the tuple-arity along with every tuple,
despite the information being statically known at the decode site.

A downside to this change is that the tuple-arity of serialized tuples
can no longer be automatically checked during deserialization. However,
for formats which do serialize the tuple-arity, either explicitly (rbml)
or implicitly (json), this check can be added to the read_tuple method.

The signature of Deserialize::read_tuple and
Deserialize::read_tuple_struct are changed, and thus binary
backwards-compatibility is broken. This change does not force
serialization formats to change, and thus does not break decoding values
serialized prior to this change.

[breaking-change]

@sfackler
Copy link
Member

cc @erickt

@danburkert
Copy link
Contributor Author

Rebased.

@aturon
Copy link
Member

aturon commented Oct 17, 2014

Ping @erickt

@erickt
Copy link
Contributor

erickt commented Oct 20, 2014

Sorry I missed this. Overall this looks good to me. Could you add a test to make sure json does a sensible thing if there are too many or not enough values to deserialize into a tuple?

@danburkert
Copy link
Contributor Author

Rebased and tests added.

@danburkert
Copy link
Contributor Author

Rebased and changed json and rbml implementations to return an Err instead of failing on tuple length mismatches during deserialization, as per @alexcrichton.

@danburkert
Copy link
Contributor Author

It's not clear to me whether these test failures are real or an aberration. None of the logs I can see show any failures.

@sfackler
Copy link
Member

@danburkert way at the bottom:

/Users/rustbuild/src/rust-buildbot/slave/auto-mac-64-opt/build/src/libserialize/json.rs:2156: line longer than 100 chars

Currently `Decoder` implementations are not provided the tuple arity as
a parameter to `read_tuple`. This forces all encoder/decoder combos to
serialize the arity along with the elements. Tuple-arity is always known
statically at the decode site, because it is part of the type of the
tuple, so it could instead be provided as an argument to `read_tuple`,
as it is to `read_struct`.

The upside to this is that serialized tuples could become smaller in
encoder/decoder implementations which choose not to serialize type
(arity) information. For example, @TyOverby's
[binary-encode](https://github.com/TyOverby/binary-encode) format is
currently forced to serialize the tuple-arity along with every tuple,
despite the information being statically known at the decode site.

A downside to this change is that the tuple-arity of serialized tuples
can no longer be automatically checked during deserialization. However,
for formats which do serialize the tuple-arity, either explicitly (rbml)
or implicitly (json), this check can be added to the `read_tuple` method.

The signature of `Deserialize::read_tuple` and
`Deserialize::read_tuple_struct` are changed, and thus binary
backwards-compatibility is broken. This change does *not* force
serialization formats to change, and thus does not break decoding values
serialized prior to this change.

[breaking-change]
@danburkert
Copy link
Contributor Author

Rebased and line length issue fixed.

bors added a commit that referenced this pull request Nov 1, 2014
…=alexcrichton

Currently `Decoder` implementations are not provided the tuple arity as
a parameter to `read_tuple`. This forces all encoder/decoder combos to
serialize the arity along with the elements. Tuple-arity is always known
statically at the decode site, because it is part of the type of the
tuple, so it could instead be provided as an argument to `read_tuple`,
as it is to `read_struct`.

The upside to this is that serialized tuples could become smaller in
encoder/decoder implementations which choose not to serialize type
(arity) information. For example, @TyOverby's
[binary-encode](https://github.com/TyOverby/binary-encode) format is
currently forced to serialize the tuple-arity along with every tuple,
despite the information being statically known at the decode site.

A downside to this change is that the tuple-arity of serialized tuples
can no longer be automatically checked during deserialization. However,
for formats which do serialize the tuple-arity, either explicitly (rbml)
or implicitly (json), this check can be added to the `read_tuple` method.

The signature of `Deserialize::read_tuple` and
`Deserialize::read_tuple_struct` are changed, and thus binary
backwards-compatibility is broken. This change does *not* force
serialization formats to change, and thus does not break decoding values
serialized prior to this change.

[breaking-change]
@bors bors closed this Nov 2, 2014
@bors bors merged commit 05f6bda into rust-lang:master Nov 2, 2014
lnicola pushed a commit to lnicola/rust that referenced this pull request Aug 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants