diff --git a/serde/src/private/ser.rs b/serde/src/private/ser.rs index 98dda162..8af1283a 100644 --- a/serde/src/private/ser.rs +++ b/serde/src/private/ser.rs @@ -1161,13 +1161,14 @@ impl<'a, M> Serializer for FlatMapSerializer<'a, M> self, _: &'static str, _: u32, - _: &'static str, + variant: &'static str, value: &T, ) -> Result where T: Serialize, { - value.serialize(self) + try!(self.0.serialize_key(variant)); + self.0.serialize_value(value) } fn serialize_seq(self, _: Option) -> Result { diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 9eccf697..6ce2c3ef 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -1763,3 +1763,37 @@ fn test_lifetime_propagation_for_flatten() { ], ); } + +#[test] +fn test_flatten_enum_newtype() { + #[derive(Serialize, Deserialize, PartialEq, Debug)] + struct S { + #[serde(flatten)] + flat: E, + } + + #[derive(Serialize, Deserialize, PartialEq, Debug)] + enum E { + Q(HashMap), + } + + let e = E::Q({ + let mut map = HashMap::new(); + map.insert("k".to_owned(), "v".to_owned()); + map + }); + let s = S { flat: e }; + + assert_tokens( + &s, + &[ + Token::Map { len: None }, + Token::Str("Q"), + Token::Map { len: Some(1) }, + Token::Str("k"), + Token::Str("v"), + Token::MapEnd, + Token::MapEnd, + ], + ); +}