@@ -352,14 +352,14 @@ impl<'a, 'de> Visitor<'de> for ComponentVisitor<'a> {
352
352
{
353
353
let mut added = HashSet :: new ( ) ;
354
354
let mut components = Vec :: new ( ) ;
355
- while let Some ( key) = map. next_key :: < & str > ( ) ? {
356
- if !added. insert ( key) {
355
+ while let Some ( key) = map. next_key :: < String > ( ) ? {
356
+ if !added. insert ( key. clone ( ) ) {
357
357
return Err ( Error :: custom ( format ! ( "duplicate component: `{key}`" ) ) ) ;
358
358
}
359
359
360
360
let registration = self
361
361
. registry
362
- . get_with_name ( key)
362
+ . get_with_name ( & key)
363
363
. ok_or_else ( || Error :: custom ( format ! ( "no registration found for `{key}`" ) ) ) ?;
364
364
components. push (
365
365
map. next_value_seed ( TypedReflectDeserializer :: new ( registration, self . registry ) ) ?,
@@ -394,6 +394,8 @@ mod tests {
394
394
use bevy_reflect:: { FromReflect , Reflect , ReflectSerialize } ;
395
395
use bincode:: Options ;
396
396
use serde:: de:: DeserializeSeed ;
397
+ use serde:: Serialize ;
398
+ use std:: io:: BufReader ;
397
399
398
400
#[ derive( Component , Reflect , Default ) ]
399
401
#[ reflect( Component ) ]
@@ -567,6 +569,49 @@ mod tests {
567
569
assert_scene_eq ( & scene, & deserialized_scene) ;
568
570
}
569
571
572
+ #[ test]
573
+ fn should_roundtrip_messagepack ( ) {
574
+ let mut world = create_world ( ) ;
575
+
576
+ world. spawn ( MyComponent {
577
+ foo : [ 1 , 2 , 3 ] ,
578
+ bar : ( 1.3 , 3.7 ) ,
579
+ baz : MyEnum :: Tuple ( "Hello World!" . to_string ( ) ) ,
580
+ } ) ;
581
+
582
+ let registry = world. resource :: < AppTypeRegistry > ( ) ;
583
+
584
+ let scene = DynamicScene :: from_world ( & world, registry) ;
585
+
586
+ let scene_serializer = SceneSerializer :: new ( & scene, & registry. 0 ) ;
587
+ let mut buf = Vec :: new ( ) ;
588
+ let mut ser = rmp_serde:: Serializer :: new ( & mut buf) ;
589
+ scene_serializer. serialize ( & mut ser) . unwrap ( ) ;
590
+
591
+ assert_eq ! (
592
+ vec![
593
+ 145 , 129 , 0 , 145 , 129 , 217 , 37 , 98 , 101 , 118 , 121 , 95 , 115 , 99 , 101 , 110 , 101 , 58 ,
594
+ 58 , 115 , 101 , 114 , 100 , 101 , 58 , 58 , 116 , 101 , 115 , 116 , 115 , 58 , 58 , 77 , 121 , 67 ,
595
+ 111 , 109 , 112 , 111 , 110 , 101 , 110 , 116 , 147 , 147 , 1 , 2 , 3 , 146 , 202 , 63 , 166 , 102 ,
596
+ 102 , 202 , 64 , 108 , 204 , 205 , 129 , 165 , 84 , 117 , 112 , 108 , 101 , 172 , 72 , 101 , 108 ,
597
+ 108 , 111 , 32 , 87 , 111 , 114 , 108 , 100 , 33
598
+ ] ,
599
+ buf
600
+ ) ;
601
+
602
+ let scene_deserializer = SceneDeserializer {
603
+ type_registry : & registry. 0 . read ( ) ,
604
+ } ;
605
+ let mut reader = BufReader :: new ( buf. as_slice ( ) ) ;
606
+
607
+ let deserialized_scene = scene_deserializer
608
+ . deserialize ( & mut rmp_serde:: Deserializer :: new ( & mut reader) )
609
+ . unwrap ( ) ;
610
+
611
+ assert_eq ! ( 1 , deserialized_scene. entities. len( ) ) ;
612
+ assert_scene_eq ( & scene, & deserialized_scene) ;
613
+ }
614
+
570
615
#[ test]
571
616
fn should_roundtrip_bincode ( ) {
572
617
let mut world = create_world ( ) ;
0 commit comments