Crate serde_smile
source ·Expand description
A Smile implementation for Serde.
Smile is a binary data format created by the developers of the Jackson serialization library for Java. It is designed to be a binary equivalent of JSON.
§Serialization Options
Smile defines several optional features that can be enabled or disabled during serialization:
Builder::raw_binary
: If enabled, binary data will be encoded directly as “raw” bytes, rather than using Smile’s 7-bit “safe” encoding. The raw format is 14% smaller and faster to serialize and deserialize, but usage means that encoded values may contain Smile control characters such as the end-of-stream token0xff
. Disabled by default.Builder::shared_strings
: If enabled, string values 64 bytes and smaller will be deduplicated in the encoded format. This increases the memory overhead of serialization and deserialization, but can significantly shrink the size of the encoded value when strings are repeated. Disabled by default.Builder::shared_properties
: If enabled, map keys 64 bytes and smaller will be deduplicated in the encoded format. This increases the memory overhead of serialization and deserialization, but can significantly shrink the size of the encoded value when keys are repeated (particularly struct field names). Enabled by default.Serializer::end
: A sequence of Smile values can optionally be terminated by the end-of-stream token0xff
. Calling this method will write the token into the output stream.
§Special Types
Smile supports two kinds of values that Serde does not natively handle: arbitrary precision integer and decimals.
This crate defines special types BigInteger
and BigDecimal
which will serialize to and deserialize from
their respective Smile types. However, they should only be used with the serializers and deserializers defined
within this crate as they will produce nonsensical values when used with other Serde libraries.
§Encoding Notes
Rust integer values that cannot be stored in an i64
will be serialized as Smile BigInteger
values. In the other
direction, BigInteger
values will be deserialized to Rust integer types if the value is small enough.
§Examples
Serialize a Rust object into a Smile value:
use serde::Serialize;
use serde_smile::Error;
#[derive(Serialize)]
struct Address {
number: u32,
street: String,
}
fn main() -> Result<(), Error> {
let address = Address {
number: 1600,
street: "Pennsylvania Avenue".to_string(),
};
let value = serde_smile::to_vec(&address)?;
Ok(())
}
Deserialize a Smile value into a Rust object:
use serde::Deserialize;
use serde_smile::Error;
#[derive(Deserialize)]
struct Address {
number: u32,
street: String,
}
fn main() -> Result<(), Error> {
let smile = b":)\n\x01\xfa\x85number\x24\x32\x80\x85street\x52Pennsylvania Avenue\xfb";
let address: Address = serde_smile::from_slice(smile)?;
println!("{} {}", address.number, address.street);
Ok(())
}
Modules§
- Deserialize Smile data into a Rust data structure.
- Serialize a Rust data structure into Smile data.
- Definition of a Smile value.
Structs§
- A structure that deserializes Smile into Rust values.
- An error encountered when serializing or deserializing to or from Smile.
- A structure for serializing Rust values into Smile.
Functions§
- Deserializes an instance of type
T
from a mutable slice of Smile data. - Deserializes an instance of type
T
from an IO stream of Smile data. - Deserializes an instance of type
T
from a slice of Smile data. - Serializes the given data structure to a Smile byte vector using default serializer settings.
- Serializes the given data structure as Smile into the IO stream using default serializer settings.