From ed2594e055184c21245b489723f42a6743fb27d9 Mon Sep 17 00:00:00 2001 From: Bo Chen Date: Fri, 30 Aug 2024 14:50:24 -0700 Subject: [PATCH] Fix manual (De)Serialize implementations with serde_json The new Deserializer implementation (#107) does not work with the 'serde_json' crate, particularly `serde_json::{to_string, from_str}`. The new implementation always expects `byte array` for deserilaiztion. Meanwhile, the 'serde_json' crate always (de)serializes `String` as `Vector` [1][2] which is treated as `sequence` (e.g. not 'byte array') by default for (de)serialization [3]. To fix this issue, this patch extends the new Deserializer implementation to support both `byte array` and `sequence`. [1] https://github.com/serde-rs/json/blob/cc7a1608c9bb7736c884926e016421af41a1ebe7/src/ser.rs#L2168-L2175 [2] https://github.com/serde-rs/json/blob/cc7a1608c9bb7736c884926e016421af41a1ebe7/src/de.rs#L30-L39 [3] https://serde.rs/data-model.html#types Signed-off-by: Patrick Roy Signed-off-by: Bo Chen --- coverage_config_x86_64.json | 2 +- src/serialize.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/coverage_config_x86_64.json b/coverage_config_x86_64.json index 578ebe3..b5e98b8 100644 --- a/coverage_config_x86_64.json +++ b/coverage_config_x86_64.json @@ -1,5 +1,5 @@ { - "coverage_score": 78.57, + "coverage_score": 81.25, "exclude_path": ".*bindings\\.rs", "crate_features": "fam-wrappers,serde" } diff --git a/src/serialize.rs b/src/serialize.rs index 16cb1d7..75c6851 100644 --- a/src/serialize.rs +++ b/src/serialize.rs @@ -42,6 +42,18 @@ macro_rules! serde_impls { backing[..limit].copy_from_slice(&bytes[..limit]); Ok(backing) } + + fn visit_seq>(self, mut seq: A) -> Result { + let mut backing = [0u8; std::mem::size_of::<$typ>()]; + + for backing_byte in &mut backing { + let Some(byte) = seq.next_element()? else { break }; + + *backing_byte = byte; + } + + Ok(backing) + } } let backing = deserializer.deserialize_bytes(BytesVisitor)?;