sval
is a lightweight serialization-only framework that treats values like a flat stream of tokens.
It's well suited to self-describing text formats like JSON.
serde
is the de-facto serialization framework for Rust and is well suited to the majority of
use cases. sval
is like a light blend of serde::ser
and serde::de
that is smaller in scope.
It makes a few key different design decisions than serde
that make it effective for working with
self-describing formats:
- The API is flat rather than using recursion to stream nested datastructures.
- All values with dynamic sizes, including text strings, can be streamed in multiple calls.
- Borrowing is an optional optimization.
- The core data model is small, with tags for extensibility.
- Values:
null
: the absence of any other meaningful value.- Booleans:
true
andfalse
. - Text strings: stream of UTF8-encoded bytes.
- Binary strings: stream of arbtirary bytes.
- Numbers:
- Integers:
u8
-u128
,i8
-i128
. - Binary floating point:
f32
-f64
.
- Integers:
- Maps: heterogeneous collection of key-value pairs.
- Sequences: heterogeneous collection of values.
- Tags: out-of-band type hints.
- Tagged values: a tag associated with a value.
- Records: tagged maps where keys are well-known labels.
- Tuples: tagged sequences.
- Enums: tagged variants, where variants are enums, tags, tagged values, records, or tuples.
sval
includes built-in tags that extend its data-model with some common datatypes:
- Rust primitives:
()
.Option<T>
.
- Arbitrary-precision decimal floating point numbers.
Other built-in tags may be added in the future. Libraries may also define their own tags.
This project has a complete and stable API, but isn't well documented yet.