bevy_reflect/serde/
mod.rs1mod 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, ®istry);
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(®istry);
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 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, ®istry);
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(®istry);
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 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, ®istry);
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, ®istry);
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(®istry);
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}