Skip to content

Commit ad5e047

Browse files
committed
Fix binary serde of enums with all ignored fields
1 parent bccdd1a commit ad5e047

File tree

2 files changed

+73
-20
lines changed

2 files changed

+73
-20
lines changed

crates/bevy_reflect/src/serde/de.rs

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
412412
enum_info.variant_names(),
413413
EnumVisitor {
414414
enum_info,
415+
registration: self.registration,
415416
registry: self.registry,
416417
},
417418
)?
@@ -704,6 +705,7 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> {
704705

705706
struct EnumVisitor<'a> {
706707
enum_info: &'static EnumInfo,
708+
registration: &'a TypeRegistration,
707709
registry: &'a TypeRegistry,
708710
}
709711

@@ -730,6 +732,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
730732
struct_info.field_names(),
731733
StructVariantVisitor {
732734
struct_info,
735+
registration: self.registration,
733736
registry: self.registry,
734737
},
735738
)?
@@ -751,6 +754,7 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
751754
tuple_info.field_len(),
752755
TupleVariantVisitor {
753756
tuple_info,
757+
registration: self.registration,
754758
registry: self.registry,
755759
},
756760
)?
@@ -816,6 +820,7 @@ impl<'de> DeserializeSeed<'de> for VariantDeserializer {
816820

817821
struct StructVariantVisitor<'a> {
818822
struct_info: &'static StructVariantInfo,
823+
registration: &'a TypeRegistration,
819824
registry: &'a TypeRegistry,
820825
}
821826

@@ -840,6 +845,18 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> {
840845
let mut index = 0usize;
841846
let mut output = DynamicStruct::default();
842847

848+
let ignored_len = self
849+
.registration
850+
.data::<SerializationData>()
851+
.map(|data| data.len())
852+
.unwrap_or(0);
853+
let field_len = self.struct_info.field_len().saturating_sub(ignored_len);
854+
855+
if field_len == 0 {
856+
// Handle all fields being ignored
857+
return Ok(output);
858+
}
859+
843860
while let Some(value) = seq.next_element_seed(TypedReflectDeserializer {
844861
registration: self
845862
.struct_info
@@ -860,6 +877,7 @@ impl<'a, 'de> Visitor<'de> for StructVariantVisitor<'a> {
860877

861878
struct TupleVariantVisitor<'a> {
862879
tuple_info: &'static TupleVariantInfo,
880+
registration: &'a TypeRegistration,
863881
registry: &'a TypeRegistry,
864882
}
865883

@@ -874,6 +892,18 @@ impl<'a, 'de> Visitor<'de> for TupleVariantVisitor<'a> {
874892
where
875893
V: SeqAccess<'de>,
876894
{
895+
let ignored_len = self
896+
.registration
897+
.data::<SerializationData>()
898+
.map(|data| data.len())
899+
.unwrap_or(0);
900+
let field_len = self.tuple_info.field_len().saturating_sub(ignored_len);
901+
902+
if field_len == 0 {
903+
// Handle all fields being ignored
904+
return Ok(DynamicTuple::default());
905+
}
906+
877907
visit_tuple(&mut seq, self.tuple_info, self.registry)
878908
}
879909
}
@@ -1042,6 +1072,7 @@ mod tests {
10421072
tuple_struct_value: SomeTupleStruct,
10431073
unit_struct: SomeUnitStruct,
10441074
ignored_struct: SomeIgnoredStruct,
1075+
ignored_enum: SomeIgnoredEnum,
10451076
unit_enum: SomeEnum,
10461077
newtype_enum: SomeEnum,
10471078
tuple_enum: SomeEnum,
@@ -1087,6 +1118,11 @@ mod tests {
10871118
Struct { foo: String },
10881119
}
10891120

1121+
#[derive(Reflect, FromReflect, Debug, PartialEq)]
1122+
enum SomeIgnoredEnum {
1123+
Ignored(#[reflect(ignore)] f32, #[reflect(ignore)] f32),
1124+
}
1125+
10901126
fn get_registry() -> TypeRegistry {
10911127
let mut registry = TypeRegistry::default();
10921128
registry.register::<MyStruct>();
@@ -1097,6 +1133,7 @@ mod tests {
10971133
registry.register::<CustomDeserialize>();
10981134
registry.register::<SomeDeserializableStruct>();
10991135
registry.register::<SomeEnum>();
1136+
registry.register::<SomeIgnoredEnum>();
11001137
registry.register::<i8>();
11011138
registry.register::<String>();
11021139
registry.register::<i64>();
@@ -1131,6 +1168,7 @@ mod tests {
11311168
tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")),
11321169
unit_struct: SomeUnitStruct,
11331170
ignored_struct: SomeIgnoredStruct(0),
1171+
ignored_enum: SomeIgnoredEnum::Ignored(0.0, 0.0),
11341172
unit_enum: SomeEnum::Unit,
11351173
newtype_enum: SomeEnum::NewType(123),
11361174
tuple_enum: SomeEnum::Tuple(1.23, 3.21),
@@ -1168,6 +1206,7 @@ mod tests {
11681206
tuple_struct_value: ("Tuple Struct"),
11691207
unit_struct: (),
11701208
ignored_struct: (),
1209+
ignored_enum: Ignored(),
11711210
unit_enum: Unit,
11721211
newtype_enum: NewType(123),
11731212
tuple_enum: Tuple(1.23, 3.21),
@@ -1382,6 +1421,7 @@ mod tests {
13821421
tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")),
13831422
unit_struct: SomeUnitStruct,
13841423
ignored_struct: SomeIgnoredStruct(0),
1424+
ignored_enum: SomeIgnoredEnum::Ignored(0.0, 0.0),
13851425
unit_enum: SomeEnum::Unit,
13861426
newtype_enum: SomeEnum::NewType(123),
13871427
tuple_enum: SomeEnum::Tuple(1.23, 3.21),
@@ -1405,10 +1445,10 @@ mod tests {
14051445
255, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 254, 255, 255, 255, 255,
14061446
255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 32, 0,
14071447
0, 0, 0, 0, 0, 0, 255, 201, 154, 59, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 84, 117, 112,
1408-
108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 1, 0, 0, 0, 123, 0, 0, 0, 0, 0,
1409-
0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3, 0, 0, 0, 20, 0, 0, 0, 0, 0,
1410-
0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97,
1411-
108, 117, 101, 100, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0,
1448+
108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 123, 0,
1449+
0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3, 0, 0, 0, 20, 0,
1450+
0, 0, 0, 0, 0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32,
1451+
118, 97, 108, 117, 101, 100, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0,
14121452
];
14131453

14141454
let deserializer = UntypedReflectDeserializer::new(&registry);
@@ -1439,6 +1479,7 @@ mod tests {
14391479
tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")),
14401480
unit_struct: SomeUnitStruct,
14411481
ignored_struct: SomeIgnoredStruct(0),
1482+
ignored_enum: SomeIgnoredEnum::Ignored(0.0, 0.0),
14421483
unit_enum: SomeEnum::Unit,
14431484
newtype_enum: SomeEnum::NewType(123),
14441485
tuple_enum: SomeEnum::Tuple(1.23, 3.21),
@@ -1456,14 +1497,14 @@ mod tests {
14561497
let input = vec![
14571498
129, 217, 40, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115,
14581499
101, 114, 100, 101, 58, 58, 100, 101, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, 121,
1459-
83, 116, 114, 117, 99, 116, 220, 0, 16, 123, 172, 72, 101, 108, 108, 111, 32, 119, 111,
1500+
83, 116, 114, 117, 99, 116, 220, 0, 17, 123, 172, 72, 101, 108, 108, 111, 32, 119, 111,
14601501
114, 108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255, 0,
14611502
1, 2, 149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 206, 59, 154, 201, 255, 145, 172, 84,
1462-
117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 144, 164, 85, 110, 105, 116,
1463-
129, 167, 78, 101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146,
1464-
202, 63, 157, 112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116,
1465-
145, 180, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97,
1466-
108, 117, 101, 146, 100, 145, 101,
1503+
117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 144, 129, 167, 73, 103, 110,
1504+
111, 114, 101, 100, 144, 164, 85, 110, 105, 116, 129, 167, 78, 101, 119, 84, 121, 112,
1505+
101, 123, 129, 165, 84, 117, 112, 108, 101, 146, 202, 63, 157, 112, 164, 202, 64, 77,
1506+
112, 164, 129, 166, 83, 116, 114, 117, 99, 116, 145, 180, 83, 116, 114, 117, 99, 116,
1507+
32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, 108, 117, 101, 146, 100, 145, 101,
14671508
];
14681509

14691510
let deserializer = UntypedReflectDeserializer::new(&registry);

crates/bevy_reflect/src/serde/ser.rs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,7 @@ mod tests {
490490
tuple_struct_value: SomeTupleStruct,
491491
unit_struct: SomeUnitStruct,
492492
ignored_struct: SomeIgnoredStruct,
493+
ignored_enum: SomeIgnoredEnum,
493494
unit_enum: SomeEnum,
494495
newtype_enum: SomeEnum,
495496
tuple_enum: SomeEnum,
@@ -519,6 +520,11 @@ mod tests {
519520
Struct { foo: String },
520521
}
521522

523+
#[derive(Reflect, FromReflect, Debug, PartialEq)]
524+
enum SomeIgnoredEnum {
525+
Ignored(#[reflect(ignore)] f32, #[reflect(ignore)] f32),
526+
}
527+
522528
#[derive(Reflect, Debug, PartialEq, Serialize)]
523529
struct SomeSerializableStruct {
524530
foo: i64,
@@ -542,6 +548,7 @@ mod tests {
542548
registry.register::<SomeTupleStruct>();
543549
registry.register::<SomeUnitStruct>();
544550
registry.register::<SomeIgnoredStruct>();
551+
registry.register::<SomeIgnoredEnum>();
545552
registry.register::<CustomSerialize>();
546553
registry.register::<SomeEnum>();
547554
registry.register::<SomeSerializableStruct>();
@@ -569,6 +576,7 @@ mod tests {
569576
tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")),
570577
unit_struct: SomeUnitStruct,
571578
ignored_struct: SomeIgnoredStruct(123),
579+
ignored_enum: SomeIgnoredEnum::Ignored(1.23, 3.45),
572580
unit_enum: SomeEnum::Unit,
573581
newtype_enum: SomeEnum::NewType(123),
574582
tuple_enum: SomeEnum::Tuple(1.23, 3.21),
@@ -614,6 +622,7 @@ mod tests {
614622
tuple_struct_value: ("Tuple Struct"),
615623
unit_struct: (),
616624
ignored_struct: (),
625+
ignored_enum: Ignored(),
617626
unit_enum: Unit,
618627
newtype_enum: NewType(123),
619628
tuple_enum: Tuple(1.23, 3.21),
@@ -761,6 +770,7 @@ mod tests {
761770
tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")),
762771
unit_struct: SomeUnitStruct,
763772
ignored_struct: SomeIgnoredStruct(123),
773+
ignored_enum: SomeIgnoredEnum::Ignored(1.23, 3.45),
764774
unit_enum: SomeEnum::Unit,
765775
newtype_enum: SomeEnum::NewType(123),
766776
tuple_enum: SomeEnum::Tuple(1.23, 3.21),
@@ -787,10 +797,10 @@ mod tests {
787797
255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 254, 255, 255, 255,
788798
255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 32,
789799
0, 0, 0, 0, 0, 0, 0, 255, 201, 154, 59, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 84, 117,
790-
112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 1, 0, 0, 0, 123, 0, 0, 0, 0,
791-
0, 0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3, 0, 0, 0, 20, 0, 0, 0, 0,
792-
0, 0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97,
793-
108, 117, 101, 100, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0,
800+
112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 123,
801+
0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 164, 112, 157, 63, 164, 112, 77, 64, 3, 0, 0, 0, 20,
802+
0, 0, 0, 0, 0, 0, 0, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116,
803+
32, 118, 97, 108, 117, 101, 100, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0,
794804
];
795805

796806
assert_eq!(expected, bytes);
@@ -813,6 +823,7 @@ mod tests {
813823
tuple_struct_value: SomeTupleStruct(String::from("Tuple Struct")),
814824
unit_struct: SomeUnitStruct,
815825
ignored_struct: SomeIgnoredStruct(123),
826+
ignored_enum: SomeIgnoredEnum::Ignored(1.23, 3.45),
816827
unit_enum: SomeEnum::Unit,
817828
newtype_enum: SomeEnum::NewType(123),
818829
tuple_enum: SomeEnum::Tuple(1.23, 3.21),
@@ -833,14 +844,15 @@ mod tests {
833844
let expected: Vec<u8> = vec![
834845
129, 217, 41, 98, 101, 118, 121, 95, 114, 101, 102, 108, 101, 99, 116, 58, 58, 115,
835846
101, 114, 100, 101, 58, 58, 115, 101, 114, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77,
836-
121, 83, 116, 114, 117, 99, 116, 220, 0, 16, 123, 172, 72, 101, 108, 108, 111, 32, 119,
847+
121, 83, 116, 114, 117, 99, 116, 220, 0, 17, 123, 172, 72, 101, 108, 108, 111, 32, 119,
837848
111, 114, 108, 100, 33, 145, 123, 146, 202, 64, 73, 15, 219, 205, 5, 57, 149, 254, 255,
838849
0, 1, 2, 149, 254, 255, 0, 1, 2, 129, 64, 32, 145, 206, 59, 154, 201, 255, 145, 172,
839-
84, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 144, 164, 85, 110, 105,
840-
116, 129, 167, 78, 101, 119, 84, 121, 112, 101, 123, 129, 165, 84, 117, 112, 108, 101,
841-
146, 202, 63, 157, 112, 164, 202, 64, 77, 112, 164, 129, 166, 83, 116, 114, 117, 99,
842-
116, 145, 180, 83, 116, 114, 117, 99, 116, 32, 118, 97, 114, 105, 97, 110, 116, 32,
843-
118, 97, 108, 117, 101, 146, 100, 145, 101,
850+
84, 117, 112, 108, 101, 32, 83, 116, 114, 117, 99, 116, 144, 144, 129, 167, 73, 103,
851+
110, 111, 114, 101, 100, 144, 164, 85, 110, 105, 116, 129, 167, 78, 101, 119, 84, 121,
852+
112, 101, 123, 129, 165, 84, 117, 112, 108, 101, 146, 202, 63, 157, 112, 164, 202, 64,
853+
77, 112, 164, 129, 166, 83, 116, 114, 117, 99, 116, 145, 180, 83, 116, 114, 117, 99,
854+
116, 32, 118, 97, 114, 105, 97, 110, 116, 32, 118, 97, 108, 117, 101, 146, 100, 145,
855+
101,
844856
];
845857

846858
assert_eq!(expected, bytes);

0 commit comments

Comments
 (0)