bevy_reflect/serde/
mod.rs

1mod de;
2mod ser;
3mod type_data;
4
5pub use de::*;
6pub use ser::*;
7pub use type_data::*;
8
9#[cfg(test)]
10mod tests {
11    use crate::{self as bevy_reflect, DynamicTupleStruct, Struct};
12    use crate::{
13        serde::{ReflectDeserializer, ReflectSerializer},
14        type_registry::TypeRegistry,
15        DynamicStruct, FromReflect, Reflect,
16    };
17    use serde::de::DeserializeSeed;
18
19    #[test]
20    fn test_serialization_struct() {
21        #[derive(Debug, Reflect, PartialEq)]
22        #[reflect(PartialEq)]
23        struct TestStruct {
24            a: i32,
25            #[reflect(ignore)]
26            b: i32,
27            #[reflect(skip_serializing)]
28            c: i32,
29            #[reflect(skip_serializing)]
30            #[reflect(default = "custom_default")]
31            d: i32,
32            e: i32,
33        }
34
35        fn custom_default() -> i32 {
36            -1
37        }
38
39        let mut registry = TypeRegistry::default();
40        registry.register::<TestStruct>();
41
42        let test_struct = TestStruct {
43            a: 3,
44            b: 4,
45            c: 5,
46            d: 6,
47            e: 7,
48        };
49
50        let serializer = ReflectSerializer::new(&test_struct, &registry);
51        let serialized =
52            ron::ser::to_string_pretty(&serializer, ron::ser::PrettyConfig::default()).unwrap();
53
54        let mut deserializer = ron::de::Deserializer::from_str(&serialized).unwrap();
55        let reflect_deserializer = ReflectDeserializer::new(&registry);
56        let value = reflect_deserializer.deserialize(&mut deserializer).unwrap();
57        let deserialized = value.take::<DynamicStruct>().unwrap();
58
59        let mut expected = DynamicStruct::default();
60        expected.insert("a", 3);
61        // Ignored: expected.insert("b", 0);
62        expected.insert("c", 0);
63        expected.insert("d", -1);
64        expected.insert("e", 7);
65
66        assert!(
67            expected.reflect_partial_eq(&deserialized).unwrap(),
68            "Deserialization failed: expected {expected:?} found {deserialized:?}"
69        );
70
71        let expected = TestStruct {
72            a: 3,
73            b: 0,
74            c: 0,
75            d: -1,
76            e: 7,
77        };
78        let received = <TestStruct as FromReflect>::from_reflect(&deserialized).unwrap();
79
80        assert_eq!(
81            expected, received,
82            "FromReflect failed: expected {expected:?} found {received:?}"
83        );
84    }
85
86    #[test]
87    fn test_serialization_tuple_struct() {
88        #[derive(Debug, Reflect, PartialEq)]
89        #[reflect(PartialEq)]
90        struct TestStruct(
91            i32,
92            #[reflect(ignore)] i32,
93            #[reflect(skip_serializing)] i32,
94            #[reflect(skip_serializing)]
95            #[reflect(default = "custom_default")]
96            i32,
97            i32,
98        );
99
100        fn custom_default() -> i32 {
101            -1
102        }
103
104        let mut registry = TypeRegistry::default();
105        registry.register::<TestStruct>();
106
107        let test_struct = TestStruct(3, 4, 5, 6, 7);
108
109        let serializer = ReflectSerializer::new(&test_struct, &registry);
110        let serialized =
111            ron::ser::to_string_pretty(&serializer, ron::ser::PrettyConfig::default()).unwrap();
112
113        let mut deserializer = ron::de::Deserializer::from_str(&serialized).unwrap();
114        let reflect_deserializer = ReflectDeserializer::new(&registry);
115        let value = reflect_deserializer.deserialize(&mut deserializer).unwrap();
116        let deserialized = value.take::<DynamicTupleStruct>().unwrap();
117
118        let mut expected = DynamicTupleStruct::default();
119        expected.insert(3);
120        // Ignored: expected.insert(0);
121        expected.insert(0);
122        expected.insert(-1);
123        expected.insert(7);
124
125        assert!(
126            expected.reflect_partial_eq(&deserialized).unwrap(),
127            "Deserialization failed: expected {expected:?} found {deserialized:?}"
128        );
129
130        let expected = TestStruct(3, 0, 0, -1, 7);
131        let received = <TestStruct as FromReflect>::from_reflect(&deserialized).unwrap();
132
133        assert_eq!(
134            expected, received,
135            "FromReflect failed: expected {expected:?} found {received:?}"
136        );
137    }
138
139    #[test]
140    #[should_panic(
141        expected = "cannot serialize dynamic value without represented type: bevy_reflect::DynamicStruct"
142    )]
143    fn should_not_serialize_unproxied_dynamic() {
144        let registry = TypeRegistry::default();
145
146        let mut value = DynamicStruct::default();
147        value.insert("foo", 123_u32);
148
149        let serializer = ReflectSerializer::new(&value, &registry);
150        ron::ser::to_string(&serializer).unwrap();
151    }
152
153    #[test]
154    fn should_roundtrip_proxied_dynamic() {
155        #[derive(Reflect)]
156        struct TestStruct {
157            a: i32,
158            b: i32,
159        }
160
161        let mut registry = TypeRegistry::default();
162        registry.register::<TestStruct>();
163
164        let value: DynamicStruct = TestStruct { a: 123, b: 456 }.clone_dynamic();
165
166        let serializer = ReflectSerializer::new(&value, &registry);
167
168        let expected = r#"{"bevy_reflect::serde::tests::TestStruct":(a:123,b:456)}"#;
169        let result = ron::ser::to_string(&serializer).unwrap();
170        assert_eq!(expected, result);
171
172        let mut deserializer = ron::de::Deserializer::from_str(&result).unwrap();
173        let reflect_deserializer = ReflectDeserializer::new(&registry);
174
175        let expected = value.clone_value();
176        let result = reflect_deserializer
177            .deserialize(&mut deserializer)
178            .unwrap()
179            .take::<DynamicStruct>()
180            .unwrap();
181
182        assert!(expected.reflect_partial_eq(&result).unwrap());
183    }
184}