pub trait Deserialize: Sized {
// Required method
fn deserialize<D: Decode + ?Sized>(decoder: &mut D) -> Result<Self>;
// Provided method
fn deserialize_many<D: Decode + ?Sized>(
decoder: &mut D,
count: usize,
) -> Result<Vec<Self>> { ... }
}Expand description
Types that know how to read themselves from any Decode source.
The contract is: deserialize consumes exactly the bytes that a
corresponding Serialize would have produced for the returned value, no
more and no fewer. On any malformed input it MUST return an error and
MUST NOT panic, allocate unboundedly, or read past the decoder’s
underlying source.
Round-trip invariant:
decode::<T>(&encode(&v)?)? == v for every v: T.
§Examples
use pack_io::{Decode, Decoder, Deserialize, Result, encode};
struct Point { x: i32, y: i32 }
impl Deserialize for Point {
fn deserialize<D: Decode + ?Sized>(dec: &mut D) -> Result<Self> {
Ok(Point {
x: i32::deserialize(dec)?,
y: i32::deserialize(dec)?,
})
}
}
let bytes = encode(&Point { x: 3, y: -7 }).unwrap();
let mut dec = Decoder::new(&bytes);
let back = Point::deserialize(&mut dec).unwrap();
assert_eq!((back.x, back.y), (3, -7));Required Methods§
Sourcefn deserialize<D: Decode + ?Sized>(decoder: &mut D) -> Result<Self>
fn deserialize<D: Decode + ?Sized>(decoder: &mut D) -> Result<Self>
Read a value of Self from the decoder, advancing its cursor.
§Errors
Any crate::SerialError the underlying byte reads surface
(truncated input, invalid length prefix, hostile varint, …).
Provided Methods§
Sourcefn deserialize_many<D: Decode + ?Sized>(
decoder: &mut D,
count: usize,
) -> Result<Vec<Self>>
fn deserialize_many<D: Decode + ?Sized>( decoder: &mut D, count: usize, ) -> Result<Vec<Self>>
Read count consecutive Self values into a freshly-allocated Vec.
The default implementation calls Deserialize::deserialize in a
loop. Types whose batch read can be done in a single bulk operation
— most importantly u8, which compiles down to a single
Read::read_exact instead of N individual byte reads — override
this for the memcpy-class fast path.
This method is the seam that makes Vec<u8> decode at memcpy
speed without forcing unsafe or specialisation onto the public
trait surface. The Vec<T>::deserialize impl calls
T::deserialize_many(decoder, len) rather than looping inline.
Implementations MUST cap any internal pre-allocation to bound
memory use against hostile length prefixes — the count argument
has already been validated against crate::Config::max_alloc by
the caller, but defensive implementations should still avoid
preallocating the full count for collections whose per-element
overhead is large.
§Errors
Propagates any error returned by the per-element / bulk read.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".
Implementations on Foreign Types§
Source§impl Deserialize for ()
impl Deserialize for ()
Source§impl Deserialize for String
impl Deserialize for String
Source§impl Deserialize for bool
impl Deserialize for bool
Source§impl Deserialize for f32
impl Deserialize for f32
Source§impl Deserialize for f64
impl Deserialize for f64
Source§impl Deserialize for i8
impl Deserialize for i8
Source§impl Deserialize for i16
impl Deserialize for i16
Source§impl Deserialize for i32
impl Deserialize for i32
Source§impl Deserialize for i64
impl Deserialize for i64
Source§impl Deserialize for i128
impl Deserialize for i128
Source§impl Deserialize for isize
impl Deserialize for isize
Source§impl Deserialize for u8
impl Deserialize for u8
Source§fn deserialize_many<D: Decode + ?Sized>(
decoder: &mut D,
count: usize,
) -> Result<Vec<u8>>
fn deserialize_many<D: Decode + ?Sized>( decoder: &mut D, count: usize, ) -> Result<Vec<u8>>
Single bulk read — bypasses the per-element loop the default impl
would emit. For an in-memory crate::Decoder this is a bounds
check plus a memcpy; for crate::IoDecoder it is one
Read::read_exact. Either way it replaces N per-byte reads with
one buffer fill.
fn deserialize<D: Decode + ?Sized>(decoder: &mut D) -> Result<Self>
Source§impl Deserialize for u16
impl Deserialize for u16
Source§impl Deserialize for u32
impl Deserialize for u32
Source§impl Deserialize for u64
impl Deserialize for u64
Source§impl Deserialize for u128
impl Deserialize for u128
Source§impl Deserialize for usize
impl Deserialize for usize
Source§impl<K, V, S> Deserialize for HashMap<K, V, S>
Available on crate feature std only.
impl<K, V, S> Deserialize for HashMap<K, V, S>
std only.Source§impl<K, V> Deserialize for BTreeMap<K, V>
impl<K, V> Deserialize for BTreeMap<K, V>
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize, T8: Deserialize, T9: Deserialize, T10: Deserialize, T11: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize, T8: Deserialize, T9: Deserialize, T10: Deserialize, T11: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize, T8: Deserialize, T9: Deserialize, T10: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize, T8: Deserialize, T9: Deserialize, T10: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize, T8: Deserialize, T9: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize, T8: Deserialize, T9: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize, T8: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize, T8: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize, T7: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6, T7)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize, T6: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5, T6)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize, T5: Deserialize> Deserialize for (T0, T1, T2, T3, T4, T5)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize> Deserialize for (T0, T1, T2, T3, T4)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize, T4: Deserialize> Deserialize for (T0, T1, T2, T3, T4)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize> Deserialize for (T0, T1, T2, T3)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize, T3: Deserialize> Deserialize for (T0, T1, T2, T3)
Source§impl<T0: Deserialize, T1: Deserialize, T2: Deserialize> Deserialize for (T0, T1, T2)
impl<T0: Deserialize, T1: Deserialize, T2: Deserialize> Deserialize for (T0, T1, T2)
Source§impl<T0: Deserialize, T1: Deserialize> Deserialize for (T0, T1)
impl<T0: Deserialize, T1: Deserialize> Deserialize for (T0, T1)
Source§impl<T0: Deserialize> Deserialize for (T0,)
impl<T0: Deserialize> Deserialize for (T0,)
Source§impl<T, S> Deserialize for HashSet<T, S>
Available on crate feature std only.
impl<T, S> Deserialize for HashSet<T, S>
std only.