Skip to main content

Serialize

Trait Serialize 

Source
pub trait Serialize {
    // Required method
    fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>;

    // Provided method
    fn serialize_slice<E: Encode + ?Sized>(
        slice: &[Self],
        encoder: &mut E,
    ) -> Result<()>
       where Self: Sized { ... }
}
Expand description

Types that know how to write themselves into any Encode sink.

The contract is: serialize appends the type’s wire-format bytes to the encoder. It does not clear the encoder first — encoders are stream-shaped, and may already hold bytes from prior writes.

Implementors MUST be deterministic: for any two equal values a and b (in the type’s Eq / PartialEq sense, or its semantic equivalent for types like f64), the bytes appended by a.serialize(&mut enc) MUST equal the bytes appended by b.serialize(&mut enc).

§Examples

use pack_io::{Encode, Encoder, Result, Serialize};

struct Point { x: i32, y: i32 }

impl Serialize for Point {
    fn serialize<E: Encode + ?Sized>(&self, enc: &mut E) -> Result<()> {
        self.x.serialize(enc)?;
        self.y.serialize(enc)
    }
}

let mut enc = Encoder::new();
Point { x: 3, y: -7 }.serialize(&mut enc).unwrap();
assert!(!enc.as_bytes().is_empty());

Required Methods§

Source

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Append the encoded bytes of self to encoder.

§Errors

Primitive impls in this crate are infallible on the in-memory crate::Encoder. Streaming encoders (IoEncoder<W>) may surface a crate::SerialError when the underlying Write errors. User impls may also surface custom errors via crate::SerialError.

Provided Methods§

Source

fn serialize_slice<E: Encode + ?Sized>( slice: &[Self], encoder: &mut E, ) -> Result<()>
where Self: Sized,

Append the encoded bytes of every element of slice to encoder.

The default implementation calls Serialize::serialize once per element. Types that can take advantage of a single bulk operation — most importantly u8, which compiles down to a single extend_from_slice / Write::write_all instead of N individual pushes — override this to skip the per-element loop overhead.

This method is the seam that makes Vec<u8> encode at memcpy speed without forcing unsafe or specialisation onto the public trait surface. The [T]::serialize impl calls T::serialize_slice(self, encoder) rather than looping inline, so any Serialize impl that overrides serialize_slice automatically applies to every &[T], Vec<T>, [T; N], and &[u8]-shaped payload that flows through it.

§Errors

Propagates any error returned by the per-element / bulk operation.

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 Serialize for ()

Source§

fn serialize<E: Encode + ?Sized>(&self, _encoder: &mut E) -> Result<()>

Source§

impl Serialize for String

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for bool

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for f32

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for f64

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for i8

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for i16

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for i32

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for i64

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for i128

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for isize

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for str

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for u8

Source§

fn serialize_slice<E: Encode + ?Sized>( slice: &[u8], encoder: &mut E, ) -> Result<()>

Single bulk write — bypasses the per-element loop the default impl would emit. For an in-memory crate::Encoder this compiles to a single Vec::extend_from_slice; for crate::IoEncoder it is one Write::write_all. Either way it replaces N per-byte calls with a memcpy.

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for u16

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for u32

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for u64

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for u128

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl Serialize for usize

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<K, V, S> Serialize for HashMap<K, V, S>
where K: Serialize, V: Serialize,

Available on crate feature std only.
Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<K, V> Serialize for BTreeMap<K, V>
where K: Serialize, V: Serialize,

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize, T4: Serialize, T5: Serialize, T6: Serialize, T7: Serialize, T8: Serialize, T9: Serialize, T10: Serialize, T11: Serialize> Serialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize, T4: Serialize, T5: Serialize, T6: Serialize, T7: Serialize, T8: Serialize, T9: Serialize, T10: Serialize> Serialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize, T4: Serialize, T5: Serialize, T6: Serialize, T7: Serialize, T8: Serialize, T9: Serialize> Serialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize, T4: Serialize, T5: Serialize, T6: Serialize, T7: Serialize, T8: Serialize> Serialize for (T0, T1, T2, T3, T4, T5, T6, T7, T8)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize, T4: Serialize, T5: Serialize, T6: Serialize, T7: Serialize> Serialize for (T0, T1, T2, T3, T4, T5, T6, T7)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize, T4: Serialize, T5: Serialize, T6: Serialize> Serialize for (T0, T1, T2, T3, T4, T5, T6)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize, T4: Serialize, T5: Serialize> Serialize for (T0, T1, T2, T3, T4, T5)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize, T4: Serialize> Serialize for (T0, T1, T2, T3, T4)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize, T3: Serialize> Serialize for (T0, T1, T2, T3)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize, T2: Serialize> Serialize for (T0, T1, T2)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize, T1: Serialize> Serialize for (T0, T1)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T0: Serialize> Serialize for (T0,)

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T, S> Serialize for HashSet<T, S>
where T: Serialize,

Available on crate feature std only.
Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T: Serialize + ?Sized> Serialize for &T

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T: Serialize, E: Serialize> Serialize for Result<T, E>

Source§

fn serialize<Enc: Encode + ?Sized>(&self, encoder: &mut Enc) -> Result<()>

Source§

impl<T: Serialize, const N: usize> Serialize for [T; N]

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T: Serialize> Serialize for Option<T>

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T: Serialize> Serialize for Vec<T>

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T: Serialize> Serialize for [T]

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Source§

impl<T> Serialize for BTreeSet<T>
where T: Serialize,

Source§

fn serialize<E: Encode + ?Sized>(&self, encoder: &mut E) -> Result<()>

Implementors§