-
Notifications
You must be signed in to change notification settings - Fork 149
Closed
Description
de/serializing ObjectId works when using rmp_serde::encode::to_vec_named, but not with rmp_serde::encode::to_vec which stores object as an array without field keys. example how it looks like:
#[derive(Deserialize, Serialize, Debug)]
struct Test {
objectid: ObjectId,
float: f64,
}
let test = Test { objectid: ObjectId::new(), float: 3.14 };
let buf = rmp_serde::encode::to_vec_named(&test)?;
dbg!(rmp_serde::from_slice::<RmpValue>(buf.as_slice())?);
let buf = rmp_serde::encode::to_vec(&test)?;
dbg!(rmp_serde::from_slice::<RmpValue>(buf.as_slice())?);
Ok(())output
rmp_serde::from_slice::(buf.as_slice())? = Map(
[
(
String(
Utf8String {
s: Ok(
"objectid",
),
},
),
Map(
[
(
String(
Utf8String {
s: Ok(
"$oid",
),
},
),
String(
Utf8String {
s: Ok(
"65c9e0a4e3f150942e7f537e",
),
},
),
),
],
),
),
(
String(
Utf8String {
s: Ok(
"float",
),
},
),
F64(
3.14,
),
),
],
)
rmp_serde::from_slice::(buf.as_slice())? = Array(
[
Array(
[
String(
Utf8String {
s: Ok(
"65c9e0a4e3f150942e7f537e",
),
},
),
],
),
F64(
3.14,
),
],
)
because the ObjectId behavior is special, i (probably) need something like this added to ObjectIdVisitor to make it work (serialize_object_id_as_hex_string is not an option):
#[inline]
fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
where
V: SeqAccess<'de>,
{
visitor.next_element::<ObjectId>()?.ok_or_else(|| {
de::Error::custom(format!("failed to deserialize ObjectId from a sequence"))
})
}are you open to it, or do you see a better solution?
Metadata
Metadata
Assignees
Labels
No labels