58 lines
2.2 KiB
Rust
58 lines
2.2 KiB
Rust
// 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<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();
|
|
}
|
|
|
|
#[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<dyn Deserializer>> = Map::new();
|
|
formats.insert("json", Box::new(<dyn Deserializer>::erase(json)));
|
|
formats.insert("cbor", Box::new(<dyn Deserializer>::erase(cbor)));
|
|
|
|
// Pick a Deserializer out of the formats map.
|
|
let format = formats.get_mut("json").unwrap();
|
|
|
|
let data: Map<String, usize> = erased_serde::deserialize(format).unwrap();
|
|
|
|
println!("{}", data["A"] + data["B"]);
|
|
}
|