//! `bincode` uses a Builder-pattern to configure the Serializers and Deserializers in this //! crate. This means that if you need to customize the behavior of `bincode`, you should create an //! instance of the `DefaultOptions` struct: //! //! ```rust //! use bincode::Options; //! let my_options = bincode::DefaultOptions::new(); //! ``` //! //! # Options Struct vs bincode functions //! //! Due to historical reasons, the default options used by the `serialize()` and `deserialize()` //! family of functions are different than the default options created by the `DefaultOptions` struct: //! //! | | Byte limit | Endianness | Int Encoding | Trailing Behavior | //! |----------|------------|------------|--------------|-------------------| //! | struct | Unlimited | Little | Varint | Reject | //! | function | Unlimited | Little | Fixint | Allow | //! //! This means that if you want to use the `Serialize` / `Deserialize` structs with the same //! settings as the functions, you should adjust the `DefaultOptions` struct like so: //! //! ```rust //! use bincode::Options; //! let my_options = bincode::DefaultOptions::new() //! .with_fixint_encoding() //! .allow_trailing_bytes(); //! ```
use de::read::BincodeRead; use error::Result; use serde; use std::io::{Read, Write}; use std::marker::PhantomData;
mod endian; mod int; mod legacy; mod limit; mod trailing;
/// The default options for bincode serialization/deserialization. /// /// ### Defaults /// By default bincode will use little-endian encoding for multi-byte integers, and will not /// limit the number of serialized/deserialized bytes. /// /// ### Configuring `DefaultOptions` /// /// `DefaultOptions` implements the [Options] trait, which means it exposes functions to change the behavior of bincode. /// /// For example, if you wanted to limit the bincode deserializer to 1 kilobyte of user input: /// /// ```rust /// use bincode::Options; /// let my_options = bincode::DefaultOptions::new().with_limit(1024); /// ``` /// /// ### DefaultOptions struct vs. functions /// /// The default configuration used by this struct is not the same as that used by the bincode /// helper functions in the root of this crate. See the /// [config](index.html#options-struct-vs-bincode-functions) module for more details #[derive(Copy, Clone)] pubstruct DefaultOptions(Infinite);
impl InternalOptions for DefaultOptions { type Limit = Infinite; type Endian = LittleEndian; type IntEncoding = VarintEncoding; type Trailing = RejectTrailing;
/// A configuration builder trait whose options Bincode will use /// while serializing and deserializing. /// /// ### Options /// Endianness: The endianness with which multi-byte integers will be read/written. *default: little endian* /// /// Limit: The maximum number of bytes that will be read/written in a bincode serialize/deserialize. *default: unlimited* /// /// Int Encoding: The encoding used for numbers, enum discriminants, and lengths. *default: varint* /// /// Trailing Behavior: The behavior when there are trailing bytes left over in a slice after deserialization. *default: reject* /// /// ### Byte Limit Details /// The purpose of byte-limiting is to prevent Denial-Of-Service attacks whereby malicious attackers get bincode /// deserialization to crash your process by allocating too much memory or keeping a connection open for too long. /// /// When a byte limit is set, bincode will return `Err` on any deserialization that goes over the limit, or any /// serialization that goes over the limit. pubtrait Options: InternalOptions + Sized { /// Sets the byte limit to be unlimited. /// This is the default. fn with_no_limit(self) -> WithOtherLimit<Self, Infinite> {
WithOtherLimit::new(self, Infinite)
}
/// Sets the byte limit to `limit`. fn with_limit(self, limit: u64) -> WithOtherLimit<Self, Bounded> {
WithOtherLimit::new(self, Bounded(limit))
}
/// Sets the endianness to little-endian /// This is the default. fn with_little_endian(self) -> WithOtherEndian<Self, LittleEndian> {
WithOtherEndian::new(self)
}
/// Sets the endianness to big-endian fn with_big_endian(self) -> WithOtherEndian<Self, BigEndian> {
WithOtherEndian::new(self)
}
/// Sets the endianness to the the machine-native endianness fn with_native_endian(self) -> WithOtherEndian<Self, NativeEndian> {
WithOtherEndian::new(self)
}
/// Sets the length encoding to varint fn with_varint_encoding(self) -> WithOtherIntEncoding<Self, VarintEncoding> {
WithOtherIntEncoding::new(self)
}
/// Sets the length encoding to be fixed fn with_fixint_encoding(self) -> WithOtherIntEncoding<Self, FixintEncoding> {
WithOtherIntEncoding::new(self)
}
/// Sets the deserializer to reject trailing bytes fn reject_trailing_bytes(self) -> WithOtherTrailing<Self, RejectTrailing> {
WithOtherTrailing::new(self)
}
/// Sets the deserializer to allow trailing bytes fn allow_trailing_bytes(self) -> WithOtherTrailing<Self, AllowTrailing> {
WithOtherTrailing::new(self)
}
/// Serializes a serializable object into a `Vec` of bytes using this configuration #[inline(always)] fn serialize<S: ?Sized + serde::Serialize>(self, t: &S) -> Result<Vec<u8>> {
::internal::serialize(t, self)
}
/// Returns the size that an object would be if serialized using Bincode with this configuration #[inline(always)] fn serialized_size<T: ?Sized + serde::Serialize>(self, t: &T) -> Result<u64> {
::internal::serialized_size(t, self)
}
/// Serializes an object directly into a `Writer` using this configuration /// /// If the serialization would take more bytes than allowed by the size limit, an error /// is returned and *no bytes* will be written into the `Writer` #[inline(always)] fn serialize_into<W: Write, T: ?Sized + serde::Serialize>(self, w: W, t: &T) -> Result<()> {
::internal::serialize_into(w, t, self)
}
/// Deserializes a slice of bytes into an instance of `T` using this configuration #[inline(always)] fn deserialize<'a, T: serde::Deserialize<'a>>(self, bytes: &'a [u8]) -> Result<T> {
::internal::deserialize(bytes, self)
}
/// Deserializes a slice of bytes with state `seed` using this configuration. #[inline(always)] fn deserialize_seed<'a, T: serde::de::DeserializeSeed<'a>>( self,
seed: T,
bytes: &'a [u8],
) -> Result<T::Value> {
::internal::deserialize_seed(seed, bytes, self)
}
/// Deserializes an object directly from a `Read`er using this configuration /// /// If this returns an `Error`, `reader` may be in an invalid state. #[inline(always)] fn deserialize_from<R: Read, T: serde::de::DeserializeOwned>(self, reader: R) -> Result<T> {
::internal::deserialize_from(reader, self)
}
/// Deserializes an object directly from a `Read`er with state `seed` using this configuration /// /// If this returns an `Error`, `reader` may be in an invalid state. #[inline(always)] fn deserialize_from_seed<'a, R: Read, T: serde::de::DeserializeSeed<'a>>( self,
seed: T,
reader: R,
) -> Result<T::Value> {
::internal::deserialize_from_seed(seed, reader, self)
}
/// Deserializes an object from a custom `BincodeRead`er using the default configuration. /// It is highly recommended to use `deserialize_from` unless you need to implement /// `BincodeRead` for performance reasons. /// /// If this returns an `Error`, `reader` may be in an invalid state. #[inline(always)] fn deserialize_from_custom<'a, R: BincodeRead<'a>, T: serde::de::DeserializeOwned>( self,
reader: R,
) -> Result<T> {
::internal::deserialize_from_custom(reader, self)
}
/// Deserializes an object from a custom `BincodeRead`er with state `seed` using the default /// configuration. It is highly recommended to use `deserialize_from` unless you need to /// implement `BincodeRead` for performance reasons. /// /// If this returns an `Error`, `reader` may be in an invalid state. #[inline(always)] fn deserialize_from_custom_seed<'a, R: BincodeRead<'a>, T: serde::de::DeserializeSeed<'a>>( self,
seed: T,
reader: R,
) -> Result<T::Value> {
::internal::deserialize_from_custom_seed(seed, reader, self)
}
}
impl<T: InternalOptions> Options for T {}
/// A configuration struct with a user-specified byte limit #[derive(Clone, Copy)] pubstruct WithOtherLimit<O: Options, L: SizeLimit> {
_options: O, pub(crate) new_limit: L,
}
/// A configuration struct with a user-specified endian order #[derive(Clone, Copy)] pubstruct WithOtherEndian<O: Options, E: BincodeByteOrder> {
options: O,
_endian: PhantomData<E>,
}
/// A configuration struct with a user-specified length encoding #[derive(Clone, Copy)] pubstruct WithOtherIntEncoding<O: Options, I: IntEncoding> {
options: O,
_length: PhantomData<I>,
}
/// A configuration struct with a user-specified trailing bytes behavior. #[derive(Clone, Copy)] pubstruct WithOtherTrailing<O: Options, T: TrailingBytes> {
options: O,
_trailing: PhantomData<T>,
}
pubtrait InternalOptions { type Limit: SizeLimit + 'static; type Endian: BincodeByteOrder + 'static; type IntEncoding: IntEncoding + 'static; type Trailing: TrailingBytes + 'static;
fn limit(&mutself) -> &mutSelf::Limit;
}
impl<'a, O: InternalOptions> InternalOptions for &'a mut O { type Limit = O::Limit; type Endian = O::Endian; type IntEncoding = O::IntEncoding; type Trailing = O::Trailing;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.