Skip to content

Custom serialization

Serde's derive macro through #[derive(Serialize, Deserialize)] provides reasonable default serialization behavior for structs and enums and it can be customized to some extent using attributes. For unusual needs, Serde allows full customization of the serialization behavior by manually implementing [Serialize] and [Deserialize] traits for your type.

The traits each have a single method:

# use serde::{Serializer, Deserializer};
#
pub trait Serialize {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer;
}

pub trait Deserialize<'de>: Sized {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>;
}
#
# fn main() {}

These methods are generic over the serialization format, represented by the [Serializer] and [Deserializer] traits. For example there is one Serializer type for JSON and a different one for Postcard.