@@ -242,37 +242,94 @@ impl<'de> Deserialize<'de> for Ident {
242
242
243
243
/// A general purpose deserializer for reflected types.
244
244
///
245
- /// This will return a [`Box<dyn Reflect>`] containing the deserialized data.
246
- /// For non-value types, this `Box` will contain the dynamic equivalent. For example, a
247
- /// deserialized struct will return a [`DynamicStruct`] and a `Vec` will return a
248
- /// [`DynamicList`]. For value types, this `Box` will contain the actual value.
249
- /// For example, an `f32` will contain the actual `f32` type.
245
+ /// This is the deserializer counterpart to [`ReflectSerializer`].
250
246
///
251
- /// This means that converting to any concrete instance will require the use of
252
- /// [`FromReflect`], or downcasting for value types.
247
+ /// See [`TypedReflectDeserializer`] for a deserializer that expects a known type.
253
248
///
254
- /// Because the type isn't known ahead of time, the serialized data must take the form of
255
- /// a map containing the following entries (in order):
256
- /// 1. `type`: The _full_ [type path]
257
- /// 2. `value`: The serialized value of the reflected type
249
+ /// # Input
258
250
///
259
- /// If the type is already known and the [`TypeInfo`] for it can be retrieved,
260
- /// [`TypedReflectDeserializer`] may be used instead to avoid requiring these entries.
251
+ /// This deserializer expects a map with a single entry,
252
+ /// where the key is the _full_ [type path] of the reflected type
253
+ /// and the value is the serialized data.
261
254
///
255
+ /// # Output
256
+ ///
257
+ /// This deserializer will return a [`Box<dyn Reflect>`] containing the deserialized data.
258
+ ///
259
+ /// For value types (i.e. [`ReflectKind::Value`]) or types that register [`ReflectDeserialize`] type data,
260
+ /// this `Box` will contain the expected type.
261
+ /// For example, deserializing an `i32` will return a `Box<i32>` (as a `Box<dyn Reflect>`).
262
+ ///
263
+ /// Otherwise, this `Box` will contain the dynamic equivalent.
264
+ /// For example, a deserialized struct might return a [`Box<DynamicStruct>`]
265
+ /// and a deserialized `Vec` might return a [`Box<DynamicList>`].
266
+ ///
267
+ /// This means that if the actual type is needed, these dynamic representations will need to
268
+ /// be converted to the concrete type using [`FromReflect`] or [`ReflectFromReflect`].
269
+ ///
270
+ /// # Example
271
+ ///
272
+ /// ```
273
+ /// # use serde::de::DeserializeSeed;
274
+ /// # use bevy_reflect::prelude::*;
275
+ /// # use bevy_reflect::{DynamicStruct, TypeRegistry, serde::ReflectDeserializer};
276
+ /// #[derive(Reflect, PartialEq, Debug)]
277
+ /// #[type_path = "my_crate"]
278
+ /// struct MyStruct {
279
+ /// value: i32
280
+ /// }
281
+ ///
282
+ /// let mut registry = TypeRegistry::default();
283
+ /// registry.register::<MyStruct>();
284
+ ///
285
+ /// let input = r#"{
286
+ /// "my_crate::MyStruct": (
287
+ /// value: 123
288
+ /// )
289
+ /// }"#;
290
+ ///
291
+ /// let mut deserializer = ron::Deserializer::from_str(input).unwrap();
292
+ /// let reflect_deserializer = ReflectDeserializer::new(®istry);
293
+ ///
294
+ /// let output: Box<dyn Reflect> = reflect_deserializer.deserialize(&mut deserializer).unwrap();
295
+ ///
296
+ /// // Since `MyStruct` is not a value type and does not register `ReflectDeserialize`,
297
+ /// // we know that its deserialized representation will be a `DynamicStruct`.
298
+ /// assert!(output.is::<DynamicStruct>());
299
+ /// assert!(output.represents::<MyStruct>());
300
+ ///
301
+ /// // We can convert back to `MyStruct` using `FromReflect`.
302
+ /// let value: MyStruct = <MyStruct as FromReflect>::from_reflect(&*output).unwrap();
303
+ /// assert_eq!(value, MyStruct { value: 123 });
304
+ ///
305
+ /// // We can also do this dynamically with `ReflectFromReflect`.
306
+ /// let type_id = output.get_represented_type_info().unwrap().type_id();
307
+ /// let reflect_from_reflect = registry.get_type_data::<ReflectFromReflect>(type_id).unwrap();
308
+ /// let value: Box<dyn Reflect> = reflect_from_reflect.from_reflect(&*output).unwrap();
309
+ /// assert!(value.is::<MyStruct>());
310
+ /// assert_eq!(value.take::<MyStruct>().unwrap(), MyStruct { value: 123 });
311
+ /// ```
312
+ ///
313
+ /// [`ReflectSerializer`]: crate::serde::ReflectSerializer
314
+ /// [type path]: crate::TypePath::type_path
262
315
/// [`Box<dyn Reflect>`]: crate::Reflect
316
+ /// [`ReflectKind::Value`]: crate::ReflectKind::Value
317
+ /// [`ReflectDeserialize`]: crate::ReflectDeserialize
318
+ /// [`Box<DynamicStruct>`]: crate::DynamicStruct
319
+ /// [`Box<DynamicList>`]: crate::DynamicList
263
320
/// [`FromReflect`]: crate::FromReflect
264
- /// [type path ]: crate::TypePath::type_path
265
- pub struct UntypedReflectDeserializer < ' a > {
321
+ /// [`ReflectFromReflect` ]: crate::ReflectFromReflect
322
+ pub struct ReflectDeserializer < ' a > {
266
323
registry : & ' a TypeRegistry ,
267
324
}
268
325
269
- impl < ' a > UntypedReflectDeserializer < ' a > {
326
+ impl < ' a > ReflectDeserializer < ' a > {
270
327
pub fn new ( registry : & ' a TypeRegistry ) -> Self {
271
328
Self { registry }
272
329
}
273
330
}
274
331
275
- impl < ' a , ' de > DeserializeSeed < ' de > for UntypedReflectDeserializer < ' a > {
332
+ impl < ' a , ' de > DeserializeSeed < ' de > for ReflectDeserializer < ' a > {
276
333
type Value = Box < dyn Reflect > ;
277
334
278
335
fn deserialize < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
@@ -365,21 +422,82 @@ impl<'a, 'de> Visitor<'de> for UntypedReflectDeserializerVisitor<'a> {
365
422
}
366
423
}
367
424
368
- /// A deserializer for reflected types whose [`TypeInfo `] is known.
425
+ /// A deserializer for reflected types whose [`TypeRegistration `] is known.
369
426
///
370
- /// This will return a [`Box<dyn Reflect>`] containing the deserialized data.
371
- /// For non-value types, this `Box` will contain the dynamic equivalent. For example, a
372
- /// deserialized struct will return a [`DynamicStruct`] and a `Vec` will return a
373
- /// [`DynamicList`]. For value types, this `Box` will contain the actual value.
374
- /// For example, an `f32` will contain the actual `f32` type.
427
+ /// This is the deserializer counterpart to [`TypedReflectSerializer`].
375
428
///
376
- /// This means that converting to any concrete instance will require the use of
377
- /// [`FromReflect`], or downcasting for value types.
429
+ /// See [`ReflectDeserializer`] for a deserializer that expects an unknown type.
378
430
///
379
- /// If the type is not known ahead of time, use [`UntypedReflectDeserializer`] instead.
431
+ /// # Input
432
+ ///
433
+ /// Since the type is already known, the input is just the serialized data.
434
+ ///
435
+ /// # Output
436
+ ///
437
+ /// This deserializer will return a [`Box<dyn Reflect>`] containing the deserialized data.
438
+ ///
439
+ /// For value types (i.e. [`ReflectKind::Value`]) or types that register [`ReflectDeserialize`] type data,
440
+ /// this `Box` will contain the expected type.
441
+ /// For example, deserializing an `i32` will return a `Box<i32>` (as a `Box<dyn Reflect>`).
442
+ ///
443
+ /// Otherwise, this `Box` will contain the dynamic equivalent.
444
+ /// For example, a deserialized struct might return a [`Box<DynamicStruct>`]
445
+ /// and a deserialized `Vec` might return a [`Box<DynamicList>`].
446
+ ///
447
+ /// This means that if the actual type is needed, these dynamic representations will need to
448
+ /// be converted to the concrete type using [`FromReflect`] or [`ReflectFromReflect`].
449
+ ///
450
+ /// # Example
451
+ ///
452
+ /// ```
453
+ /// # use std::any::TypeId;
454
+ /// # use serde::de::DeserializeSeed;
455
+ /// # use bevy_reflect::prelude::*;
456
+ /// # use bevy_reflect::{DynamicStruct, TypeRegistry, serde::TypedReflectDeserializer};
457
+ /// #[derive(Reflect, PartialEq, Debug)]
458
+ /// struct MyStruct {
459
+ /// value: i32
460
+ /// }
461
+ ///
462
+ /// let mut registry = TypeRegistry::default();
463
+ /// registry.register::<MyStruct>();
464
+ ///
465
+ /// let input = r#"(
466
+ /// value: 123
467
+ /// )"#;
468
+ ///
469
+ /// let registration = registry.get(TypeId::of::<MyStruct>()).unwrap();
470
+ ///
471
+ /// let mut deserializer = ron::Deserializer::from_str(input).unwrap();
472
+ /// let reflect_deserializer = TypedReflectDeserializer::new(registration, ®istry);
473
+ ///
474
+ /// let output: Box<dyn Reflect> = reflect_deserializer.deserialize(&mut deserializer).unwrap();
475
+ ///
476
+ /// // Since `MyStruct` is not a value type and does not register `ReflectDeserialize`,
477
+ /// // we know that its deserialized representation will be a `DynamicStruct`.
478
+ /// assert!(output.is::<DynamicStruct>());
479
+ /// assert!(output.represents::<MyStruct>());
480
+ ///
481
+ /// // We can convert back to `MyStruct` using `FromReflect`.
482
+ /// let value: MyStruct = <MyStruct as FromReflect>::from_reflect(&*output).unwrap();
483
+ /// assert_eq!(value, MyStruct { value: 123 });
484
+ ///
485
+ /// // We can also do this dynamically with `ReflectFromReflect`.
486
+ /// let type_id = output.get_represented_type_info().unwrap().type_id();
487
+ /// let reflect_from_reflect = registry.get_type_data::<ReflectFromReflect>(type_id).unwrap();
488
+ /// let value: Box<dyn Reflect> = reflect_from_reflect.from_reflect(&*output).unwrap();
489
+ /// assert!(value.is::<MyStruct>());
490
+ /// assert_eq!(value.take::<MyStruct>().unwrap(), MyStruct { value: 123 });
491
+ /// ```
380
492
///
493
+ /// [`TypedReflectSerializer`]: crate::serde::TypedReflectSerializer
381
494
/// [`Box<dyn Reflect>`]: crate::Reflect
495
+ /// [`ReflectKind::Value`]: crate::ReflectKind::Value
496
+ /// [`ReflectDeserialize`]: crate::ReflectDeserialize
497
+ /// [`Box<DynamicStruct>`]: crate::DynamicStruct
498
+ /// [`Box<DynamicList>`]: crate::DynamicList
382
499
/// [`FromReflect`]: crate::FromReflect
500
+ /// [`ReflectFromReflect`]: crate::ReflectFromReflect
383
501
pub struct TypedReflectDeserializer < ' a > {
384
502
registration : & ' a TypeRegistration ,
385
503
registry : & ' a TypeRegistry ,
@@ -1062,7 +1180,7 @@ mod tests {
1062
1180
use bevy_utils:: HashMap ;
1063
1181
1064
1182
use crate as bevy_reflect;
1065
- use crate :: serde:: { ReflectSerializer , TypedReflectDeserializer , UntypedReflectDeserializer } ;
1183
+ use crate :: serde:: { ReflectDeserializer , ReflectSerializer , TypedReflectDeserializer } ;
1066
1184
use crate :: { DynamicEnum , FromReflect , Reflect , ReflectDeserialize , TypeRegistry } ;
1067
1185
1068
1186
#[ derive( Reflect , Debug , PartialEq ) ]
@@ -1252,7 +1370,7 @@ mod tests {
1252
1370
),
1253
1371
}"# ;
1254
1372
1255
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1373
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1256
1374
let mut ron_deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1257
1375
let dynamic_output = reflect_deserializer
1258
1376
. deserialize ( & mut ron_deserializer)
@@ -1269,7 +1387,7 @@ mod tests {
1269
1387
}"# ;
1270
1388
1271
1389
let registry = get_registry ( ) ;
1272
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1390
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1273
1391
let mut ron_deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1274
1392
let dynamic_output = reflect_deserializer
1275
1393
. deserialize ( & mut ron_deserializer)
@@ -1336,7 +1454,7 @@ mod tests {
1336
1454
),
1337
1455
}"# ;
1338
1456
1339
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1457
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1340
1458
let mut ron_deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1341
1459
let dynamic_output = reflect_deserializer
1342
1460
. deserialize ( & mut ron_deserializer)
@@ -1358,7 +1476,7 @@ mod tests {
1358
1476
),
1359
1477
}"# ;
1360
1478
1361
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1479
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1362
1480
let mut ron_deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1363
1481
let dynamic_output = reflect_deserializer
1364
1482
. deserialize ( & mut ron_deserializer)
@@ -1388,7 +1506,7 @@ mod tests {
1388
1506
let input = r#"{
1389
1507
"bevy_reflect::serde::de::tests::MyEnum": Unit,
1390
1508
}"# ;
1391
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1509
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1392
1510
let mut deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1393
1511
let output = reflect_deserializer. deserialize ( & mut deserializer) . unwrap ( ) ;
1394
1512
@@ -1399,7 +1517,7 @@ mod tests {
1399
1517
let input = r#"{
1400
1518
"bevy_reflect::serde::de::tests::MyEnum": NewType(123),
1401
1519
}"# ;
1402
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1520
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1403
1521
let mut deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1404
1522
let output = reflect_deserializer. deserialize ( & mut deserializer) . unwrap ( ) ;
1405
1523
@@ -1410,7 +1528,7 @@ mod tests {
1410
1528
let input = r#"{
1411
1529
"bevy_reflect::serde::de::tests::MyEnum": Tuple(1.23, 3.21),
1412
1530
}"# ;
1413
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1531
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1414
1532
let mut deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1415
1533
let output = reflect_deserializer. deserialize ( & mut deserializer) . unwrap ( ) ;
1416
1534
@@ -1423,7 +1541,7 @@ mod tests {
1423
1541
value: "I <3 Enums",
1424
1542
),
1425
1543
}"# ;
1426
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1544
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1427
1545
let mut deserializer = ron:: de:: Deserializer :: from_str ( input) . unwrap ( ) ;
1428
1546
let output = reflect_deserializer. deserialize ( & mut deserializer) . unwrap ( ) ;
1429
1547
@@ -1443,7 +1561,7 @@ mod tests {
1443
1561
let serialized1 = ron:: ser:: to_string ( & serializer1) . unwrap ( ) ;
1444
1562
1445
1563
let mut deserializer = ron:: de:: Deserializer :: from_str ( & serialized1) . unwrap ( ) ;
1446
- let reflect_deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1564
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
1447
1565
let input2 = reflect_deserializer. deserialize ( & mut deserializer) . unwrap ( ) ;
1448
1566
1449
1567
let serializer2 = ReflectSerializer :: new ( & * input2, & registry) ;
@@ -1473,7 +1591,7 @@ mod tests {
1473
1591
0 ,
1474
1592
] ;
1475
1593
1476
- let deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1594
+ let deserializer = ReflectDeserializer :: new ( & registry) ;
1477
1595
1478
1596
let dynamic_output = bincode:: DefaultOptions :: new ( )
1479
1597
. with_fixint_encoding ( )
@@ -1505,7 +1623,7 @@ mod tests {
1505
1623
1506
1624
let mut reader = std:: io:: BufReader :: new ( input. as_slice ( ) ) ;
1507
1625
1508
- let deserializer = UntypedReflectDeserializer :: new ( & registry) ;
1626
+ let deserializer = ReflectDeserializer :: new ( & registry) ;
1509
1627
let dynamic_output = deserializer
1510
1628
. deserialize ( & mut rmp_serde:: Deserializer :: new ( & mut reader) )
1511
1629
. unwrap ( ) ;
0 commit comments