diff --git a/Cargo.toml b/Cargo.toml index 910aa5dd..e7c4d998 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ rustyline = { version = "10", optional = true } [dev-dependencies] serde_bytes = "0.11" +rmp-serde = "1.1" serde_json = { version = "1.0", default-features = false, features = ["alloc"] } [features] diff --git a/src/serde/deserialize.rs b/src/serde/deserialize.rs index 2534a1d5..d44ad962 100644 --- a/src/serde/deserialize.rs +++ b/src/serde/deserialize.rs @@ -127,20 +127,20 @@ impl<'de> Visitor<'de> for DynamicVisitor { #[inline(always)] fn visit_char(self, v: char) -> Result { - self.visit_string(v.to_string()) + Ok(v.into()) } #[inline(always)] fn visit_str(self, v: &str) -> Result { Ok(v.into()) } #[inline(always)] - fn visit_borrowed_str(self, v: &str) -> Result { - self.visit_str(v) - } - #[inline(always)] fn visit_string(self, v: String) -> Result { Ok(v.into()) } + #[inline(always)] + fn visit_bytes(self, v: &[u8]) -> Result { + Ok(Dynamic::from_blob(v.to_vec())) + } #[inline(always)] fn visit_unit(self) -> Result { diff --git a/src/serde/serialize.rs b/src/serde/serialize.rs index 0e9c481f..dc98ce75 100644 --- a/src/serde/serialize.rs +++ b/src/serde/serialize.rs @@ -20,7 +20,7 @@ impl Serialize for Dynamic { Union::Unit(..) => ser.serialize_unit(), Union::Bool(x, ..) => ser.serialize_bool(x), Union::Str(ref s, ..) => ser.serialize_str(s.as_str()), - Union::Char(c, ..) => ser.serialize_str(&c.to_string()), + Union::Char(c, ..) => ser.serialize_char(c), #[cfg(not(feature = "only_i32"))] Union::Int(x, ..) => ser.serialize_i64(x), @@ -58,7 +58,7 @@ impl Serialize for Dynamic { #[cfg(not(feature = "no_index"))] Union::Array(ref a, ..) => (**a).serialize(ser), #[cfg(not(feature = "no_index"))] - Union::Blob(ref a, ..) => (**a).serialize(ser), + Union::Blob(ref a, ..) => ser.serialize_bytes(&**a), #[cfg(not(feature = "no_object"))] Union::Map(ref m, ..) => { let mut map = ser.serialize_map(Some(m.len()))?; diff --git a/tests/serde.rs b/tests/serde.rs index 28f3e1bb..2787ca2f 100644 --- a/tests/serde.rs +++ b/tests/serde.rs @@ -809,10 +809,31 @@ fn test_serde_blob() -> Result<(), Box> { ", )?; + let json = serde_json::to_string(&r).unwrap(); + + assert_eq!(json, "[0,1,2,3,4,5,6,7,8,9]"); + let r = from_dynamic::(&r)?; assert_eq!(r.to_vec(), vec![0_u8, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + #[cfg(not(feature = "no_object"))] + { + let r = engine.eval::( + " + let x = blob(10); + for i in 0..10 { x[i] = i; } + #{ x: x } + ", + )?; + + let data = format!("{r:?}"); + + let encoded = rmp_serde::to_vec(&r).unwrap(); + let decoded: Dynamic = rmp_serde::from_slice(&encoded).unwrap(); + + assert_eq!(format!("{decoded:?}"), data); + } Ok(()) }