// Please also update README.md when making changes to this code. use erased_serde::{Deserializer, Serialize, Serializer}; use std::collections::BTreeMap as Map; use std::io; #[test] fn serialization() { // 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> = Map::new(); formats.insert("json", Box::new(::erase(json))); formats.insert("cbor", Box::new(::erase(cbor))); // These are boxed trait objects as well. Same thing here - type erasure // makes this possible. let mut values: Map<&str, Box> = 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(); } #[test] fn deserialization() { static JSON: &[u8] = br#"{"A": 65, "B": 66}"#; static CBOR: &[u8] = &[162, 97, 65, 24, 65, 97, 66, 24, 66]; // Construct some deserializers. let json = &mut serde_json::Deserializer::from_slice(JSON); let cbor = &mut serde_cbor::Deserializer::from_slice(CBOR); // The values in this map are boxed trait objects, which is not possible // with the normal serde::Deserializer because of object safety. let mut formats: Map<&str, Box> = Map::new(); formats.insert("json", Box::new(::erase(json))); formats.insert("cbor", Box::new(::erase(cbor))); // Pick a Deserializer out of the formats map. let format = formats.get_mut("json").unwrap(); let data: Map = erased_serde::deserialize(format).unwrap(); println!("{}", data["A"] + data["B"]); }