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::new(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"]);
}