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

Reimplement #[bitcode(with_serde)] #47

Open
caibear opened this issue Sep 24, 2024 · 4 comments
Open

Reimplement #[bitcode(with_serde)] #47

caibear opened this issue Sep 24, 2024 · 4 comments

Comments

@caibear
Copy link
Collaborator

caibear commented Sep 24, 2024

There have been many requests for supporting 3rd party crates such as: time, rust_decimal, uuid, and chrono. Rather than implementing support manually for these crates and more, an easier solution is to allow types implementing serde::Serialize inside types implementing bitcode::Encode.

This was previously a feature in 0.5, but we didn't reimplement it in the 0.6 rewrite due due to technical limitations. I have since found a path forward and intend to add this feature to 0.6.

The downsides of using serde instead of implementing these types in native bitcode are:

  1. Worse performance
  2. Requiring #[bitcode(with_serde)] annotations on every field where serde is used
  3. Doesn't work well on collection types since it forces everything inside them to use serde

1 and 2 aren't much of an issue if serde is used infrequently. 3 poses more of an issue, but so far none of the types requested are collections. We could mitigate it by implementing some of the popular collections such as IndexMap.

@finnbear
Copy link
Member

finnbear commented Sep 24, 2024

Downside 4: serialize returns a Result, so encode would either have to return a Result (breaks compatibility with 0.6) or panic on Err from serialize.

Still in favor of this, though!

@caibear
Copy link
Collaborator Author

caibear commented Sep 24, 2024

Implementing this would partially-fully resolve these open issues:
#45 could use serde_repr to serialize enum as u16
#40
#39
#38
#37
#35 bitcode serde already supports recursive types, so you could embed them in bitcode::Encode types
#33
#29 use serde on field you want to skip with serialize impl that does nothing
#27
#24
#13

@vnghia
Copy link

vnghia commented Sep 25, 2024

I would like to ask if we use #[bitcode(with_serde) for example with uuid::Uuid, do we get to choose which representation we want (something similar with {de}serialize_with) because I think most people will want to encode an Uuid with u128 instead of a str (no one will open the bitcode message to read anyway :D).

@finnbear
Copy link
Member

finnbear commented Sep 25, 2024

most people will want to encode an Uuid with [bytes] instead of a str

The correct choice is made automatically, considering uuid checks whether the format is human readable. bitcode is not human readable, so uuid uses raw bytes.

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

No branches or pull requests

3 participants