Trait erased_serde::Serialize

source ·
pub trait Serialize: Sealed {
    // Required method
    fn erased_serialize(
        &self,
        serializer: &mut dyn Serializer
    ) -> Result<(), Error>;
}
Expand description

An object-safe equivalent of Serde’s Serialize trait.

Any implementation of Serde’s Serialize converts seamlessly to a &dyn erased_serde::Serialize or Box<dyn erased_serde::Serialize> trait object.

use erased_serde::{Serialize, Serializer};
use std::collections::BTreeMap as Map;
use std::io;

fn main() {
    // Construct some serializers.
    let json = &mut serde_json::Serializer::new(io::stdout());
    let cbor = &mut serde_cbor::Serializer::new(serde_cbor::ser::IoWrite::new(io::stdout()));

    // The values in this map are boxed trait objects. Ordinarily this would not
    // be possible with serde::Serializer because of object safety, but type
    // erasure makes it possible with erased_serde::Serializer.
    let mut formats: Map<&str, Box<dyn Serializer>> = Map::new();
    formats.insert("json", Box::new(<dyn Serializer>::erase(json)));
    formats.insert("cbor", Box::new(<dyn Serializer>::erase(cbor)));

    // These are boxed trait objects as well. Same thing here - type erasure
    // makes this possible.
    let mut values: Map<&str, Box<dyn Serialize>> = Map::new();
    values.insert("vec", Box::new(vec!["a", "b"]));
    values.insert("int", Box::new(65536));

    // Pick a Serializer out of the formats map.
    let format = formats.get_mut("json").unwrap();

    // Pick a Serialize out of the values map.
    let value = values.get("vec").unwrap();

    // This line prints `["a","b"]` to stdout.
    value.erased_serialize(format).unwrap();
}

This trait is sealed and can only be implemented via a serde::Serialize impl.

Required Methods§

source

fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>

Trait Implementations§

source§

impl<'erased> Serialize for dyn Serialize + 'erased

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'erased> Serialize for dyn Serialize + Send + 'erased

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'erased> Serialize for dyn Serialize + Send + Sync + 'erased

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'erased> Serialize for dyn Serialize + Sync + 'erased

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more

Implementors§

source§

impl<T> Serialize for T
where T: ?Sized + Serialize,