This crate provides type-erased versions of Serde's Serialize
, Serializer
and Deserializer
traits that can be used as trait
objects.
The usual Serde Serialize
, Serializer
and Deserializer
traits cannot
be used as trait objects like &Serialize
or boxed trait objects like
Box<Serialize>
because of Rust's "object safety"
rules. In particular,
all three traits contain generic methods which cannot be made into a trait
object.
The traits in this crate work seamlessly with any existing Serde
Serialize
and Deserialize
type and any existing Serde Serializer
and
Deserializer
format.
Serialization
extern crate erased_serde;
extern crate serde_json;
extern crate serde_cbor;
use std::collections::BTreeMap as Map;
use std::io;
use erased_serde::{Serialize, Serializer};
fn main() {
let json = &mut serde_json::ser::Serializer::new(io::stdout());
let cbor = &mut serde_cbor::ser::Serializer::new(io::stdout());
let mut formats: Map<&str, Box<Serializer>> = Map::new();
formats.insert("json", Box::new(Serializer::erase(json)));
formats.insert("cbor", Box::new(Serializer::erase(cbor)));
let mut values: Map<&str, Box<Serialize>> = Map::new();
values.insert("vec", Box::new(vec!["a", "b"]));
values.insert("int", Box::new(65536));
let format = formats.get_mut("json").unwrap();
let value = values.get("vec").unwrap();
value.erased_serialize(format).unwrap();
}
Deserialization
extern crate erased_serde;
extern crate serde_json;
extern crate serde_cbor;
use std::collections::BTreeMap as Map;
use erased_serde::Deserializer;
fn main() {
static JSON: &'static [u8] = br#"{"A": 65, "B": 66}"#;
static CBOR: &'static [u8] = &[162, 97, 65, 24, 65, 97, 66, 24, 66];
let json = &mut serde_json::de::Deserializer::from_slice(JSON);
let cbor = &mut serde_cbor::de::Deserializer::from_slice(CBOR);
let mut formats: Map<&str, Box<Deserializer>> = Map::new();
formats.insert("json", Box::new(Deserializer::erase(json)));
formats.insert("cbor", Box::new(Deserializer::erase(cbor)));
let format = formats.get_mut("json").unwrap();
let data: Map<String, usize> = erased_serde::deserialize(format).unwrap();
println!("{}", data["A"] + data["B"]);
}