Skip to content

Serde #[serde(skip_serializing_if="Option::is_none")] fails #86

@chridou

Description

@chridou

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);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions