The Serde Rust Framework

This page summarizes the projects mentioned and recommended in the original post on news.ycombinator.com

Our great sponsors
  • InfluxDB - Power Real-Time Data Analytics at Scale
  • WorkOS - The modern identity platform for B2B SaaS
  • SaaSHub - Software Alternatives and Reviews
  • serde

    Serialization framework for Rust

  • We almost always deserialize to owned data, partly because our deserialization source is almost always compressed so the data has to be copied. There are a few cases where we want to serialize with a reference and deserialize to owned, but that's no big deal using custom "with" functions.

    We have hit one serde footgun, which is that skip-serializing-if corrupts your data with formats like bincode :-(. https://github.com/serde-rs/serde/issues/1732 really wish that could be fixed.

  • serde_v8

    Discontinued Moved to https://github.com/denoland/deno

  • Whilst not classical de/serialization I wrote serde_v8 (https://github.com/denoland/serde_v8), an expressive and ~maximally efficient bijection between v8 & rust.

    It has powered Deno's op-layer since 1.9 (https://deno.com/blog/v1.9#faster-calls-into-rust-with-serde...) and has enabled significant improvements in opcall overhead (close to 100x) whilst also simplifying said op-layer.

  • InfluxDB

    Power Real-Time Data Analytics at Scale. Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.

    InfluxDB logo
  • Rocket

    A web framework for Rust.

  • Is there any Rust web framework that does not have problem with Slow-Loris ?

    https://github.com/SergioBenitez/Rocket/issues/1405

  • miniserde

    Data structure serialization library with several opposite design goals from Serde

  • The only downside is compile time bloat.

    Serde generates heaps and heaps of generic code. This gets optimized away to be very efficient, but it can be quite cumbersome.

    Ever tried working on a crate with hundreds or thousands of de/serializable types? Compile times shoot through the roof really quickly.

    The maintainer of serde also created `miniserde` [1], which uses dynamic dispatch and can have 4x compile time improvements.

    Due to Rusts lack of orphan instances you really depend on a pervasive standard for serializiation which is used by all libraries, so the ecosystem is really locked in to serde by now.

    [1] https://github.com/dtolnay/miniserde

  • node-foundationdb

    Modern Node.js FoundationDB bindings

  • Thats fantastic.

    I maintain the nodejs bindings for foundationdb. Foundationdb refuses to publish a wire protocol, so the bindings are implemented as native code wrapped by n_api. The code is a rat's nest of calls to methods like `napi_get_value_string_utf8` to parse javascript objects into C. (Eg [1]). As well as being difficult to read and write, I'm sure there's weird bugs lurking somewhere in all that boilerplate code.

    I'd much prefer all that code to just be in rust. That looks way easier to use than all the goopy serialization nonsense I'm doing now. (Though I'd want a serde_napi variant instead of going straight to v8).

    [1] https://github.com/josephg/node-foundationdb/blob/master/src...

  • create-rust-app

    Set up a modern rust+react web app by running one command.

  • I thought I'd share my project in case anyone wanted to quickly evaluate rust for web:

    https://github.com/wulf/create-rust-app

    Although there's a lot of work left to be done, I'd love to hear feedback, painpoints and ideas you have :)

    Hoping to have documentation up at create-rust-app.dev soon~

  • manifold

    Manifold is a Java compiler plugin, its features include Metaprogramming, Properties, Extension Methods, Operator Overloading, Templates, a Preprocessor, and more.

  • Java has annotation processors which can perform code generation, just like Serde does.

    Manifold [1] an example framework that relies heavily on that, achieving similar things like Serde.

    Java developers don't like to use these things too much though, unlike Rust developers who love their `#derive`, so you're mostly right that reflection-based serialization is still more common, but that's by choice.

    Dependency Injection is in a similar situation: frameworks like Micronaut can do it without reflection, and things like Google Dagger [3] have existed for several years that do the same thing... but still, most Spring Boot-based projects I know of use reflection-based DI as well... it's fast and the security issues have been largely mitigated nowadays.

    [1] http://manifold.systems/

    [2] https://docs.micronaut.io/latest/guide/

    [3] https://rskupnik.github.io/dependency-injection-in-pet-proje...

  • WorkOS

    The modern identity platform for B2B SaaS. The APIs are flexible and easy-to-use, supporting authentication, user identity, and complex enterprise features like SSO and SCIM provisioning.

    WorkOS logo
  • sapio

    A Bitcoin Programming Language

  • one thing that has kinda irked me about serde is that there's relatively limited support for bounding memory usage for types like a Vec at deserialize time without a lot of manual work.

    It is doable (e.g. see SafePSBT deserializer here https://github.com/sapio-lang/sapio/blob/master/ctv_emulator...), just not particularly ergonomic.

  • ComLightInterop

    Cross-platform COM interop library for .NET Core 2.1 or newer

  • > Does it feel "brittle" to use

    Yes and no.

    No because when you try to do unsupported things like calling a method on an object which doesn’t support one, you gonna get an appropriate runtime exception.

    Yes because if you fail lower-level things like local parameter allocation, you gonna get an appropriate runtime exception but that one is (1) too late, I’d prefer such things to be detected when you emit the code, not when trying to use the generated code (2) Lacks the context.

    Overall, when I can I’m using that higher-level System.Linq.Expressions for runtime codegen. Things are much nicer at that level. I only using the low-level thing when I need to emit new types, like there: https://github.com/Const-me/ComLightInterop/blob/master/ComL...

  • nanoserde

    Serialisation library with zero dependencies

  • makepad

    Makepad is a creative software development platform for Rust that compiles to wasm/webGL, osx/metal, windows/dx11 linux/opengl

  • pfr

    std::tuple like methods for user defined types without any macro or boilerplate code

  • I wonder if the c++ approach of boost.pfr would be portable to rust ? It allows reflection on aggregates without needing to annotate anything: https://github.com/boostorg/pfr

NOTE: The number of mentions on this list indicates mentions on common posts plus user suggested alternatives. Hence, a higher number means a more popular project.

Suggest a related project

Related posts