diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index 2fb35a38..4c8d8e64 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -966,6 +966,7 @@ fn serialize_tuple_struct_visitor( fields .iter() .enumerate() + .filter(|&(_, ref field)| !field.attrs.skip_serializing()) .map(|(i, field)| { let mut field_expr = if is_enum { let id = Ident::new(&format!("__field{}", i), Span::call_site()); diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index cb1cc6ad..d3ae4726 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -657,6 +657,44 @@ fn test_skip_serializing_struct() { ); } +#[derive(Debug, PartialEq, Serialize)] +struct SkipSerializingTupleStruct<'a, B, C>( + &'a i8, + #[serde(skip_serializing)] B, + #[serde(skip_serializing_if = "ShouldSkip::should_skip")] C, +) +where + C: ShouldSkip; + +#[test] +fn test_skip_serializing_tuple_struct() { + let a = 1; + assert_ser_tokens( + &SkipSerializingTupleStruct(&a, 2, 3), + &[ + Token::TupleStruct { + name: "SkipSerializingTupleStruct", + len: 2, + }, + Token::I8(1), + Token::I32(3), + Token::TupleStructEnd, + ], + ); + + assert_ser_tokens( + &SkipSerializingTupleStruct(&a, 2, 123), + &[ + Token::TupleStruct { + name: "SkipSerializingTupleStruct", + len: 2, + }, + Token::I8(1), + Token::TupleStructEnd, + ], + ); +} + #[derive(Debug, PartialEq, Serialize, Deserialize)] struct SkipStruct { a: i8, @@ -705,6 +743,11 @@ where #[serde(skip_serializing_if = "ShouldSkip::should_skip")] c: C, }, + Tuple( + &'a i8, + #[serde(skip_serializing)] B, + #[serde(skip_serializing_if = "ShouldSkip::should_skip")] C, + ), } #[test] @@ -743,6 +786,33 @@ fn test_skip_serializing_enum() { Token::StructVariantEnd, ], ); + + assert_ser_tokens( + &SkipSerializingEnum::Tuple(&a, 2, 3), + &[ + Token::TupleVariant { + name: "SkipSerializingEnum", + variant: "Tuple", + len: 2, + }, + Token::I8(1), + Token::I32(3), + Token::TupleVariantEnd, + ], + ); + + assert_ser_tokens( + &SkipSerializingEnum::Tuple(&a, 2, 123), + &[ + Token::TupleVariant { + name: "SkipSerializingEnum", + variant: "Tuple", + len: 2, + }, + Token::I8(1), + Token::TupleVariantEnd, + ], + ); } #[derive(Debug, PartialEq)]