-
Notifications
You must be signed in to change notification settings - Fork 155
Serde #[serde(skip_serializing_if="Option::is_none")] fails #86
Copy link
Copy link
Open
Description
When using #[serde(skip_serializing_if="Option::is_none")] on a field that has the value None and if it is not the last field deserialization fails(maybe it is already serialized in a wrong way)
Here is some test code:
#[cfg(test)]
mod test_rmp_serde {
use serde::{Serialize, Deserialize};
use serde_msgpack::{Serializer, Deserializer};
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Example1 {
test_field: i64,
name: Option<String>,
items: Vec<i64>,
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Example2 {
#[serde(rename = "test_field_renamed")]
test_field: i64,
// If you remove this annotation, it will pass
#[serde(skip_serializing_if="Option::is_none")]
name: Option<String>,
#[serde(rename = "items_renamed")]
items: Vec<i64>,
}
#[test]
fn without_serde_attributes() {
let original = Example1 {
test_field: 0,
items: vec![],
name: None,
};
let mut buf = Vec::new();
{
let mut ser = Serializer::new(&mut buf);
original.serialize(&mut ser).unwrap();
}
let mut deser = Deserializer::new(buf.as_slice());
let deserialized = Example1::deserialize(&mut deser).unwrap();
assert_eq!(original, deserialized);
}
#[test]
fn with_serde_attributes() {
let original = Example2 {
test_field: 0,
items: vec![],
name: None,
};
let mut buf = Vec::new();
{
let mut ser = Serializer::new(&mut buf);
original.serialize(&mut ser).unwrap();
}
let mut deser = Deserializer::new(buf.as_slice());
let deserialized = Example2::deserialize(&mut deser).unwrap();
assert_eq!(original, deserialized);
}
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels