@@ -3359,6 +3359,40 @@ bevy_reflect::tests::Test {
3359
3359
) ;
3360
3360
}
3361
3361
3362
+ #[ test]
3363
+ fn should_serialize_opaque_remote_type ( ) {
3364
+ mod external_crate {
3365
+ use serde:: { Deserialize , Serialize } ;
3366
+ #[ derive( Clone , Debug , PartialEq , Serialize , Deserialize ) ]
3367
+ pub struct Vector2 < T > ( pub [ T ; 2 ] ) ;
3368
+ }
3369
+
3370
+ #[ reflect_remote( external_crate:: Vector2 <i32 >) ]
3371
+ #[ derive( Clone , Debug , PartialEq , Serialize , Deserialize ) ]
3372
+ #[ reflect( Serialize , Deserialize ) ]
3373
+ #[ reflect( opaque) ]
3374
+ struct Vector2Wrapper ( [ i32 ; 2 ] ) ;
3375
+
3376
+ #[ derive( Reflect , Debug , PartialEq ) ]
3377
+ struct Point ( #[ reflect( remote = Vector2Wrapper ) ] external_crate:: Vector2 < i32 > ) ;
3378
+
3379
+ let point = Point ( external_crate:: Vector2 ( [ 1 , 2 ] ) ) ;
3380
+
3381
+ let mut registry = TypeRegistry :: new ( ) ;
3382
+ registry. register :: < Point > ( ) ;
3383
+ registry. register :: < Vector2Wrapper > ( ) ;
3384
+
3385
+ let serializer = ReflectSerializer :: new ( & point, & registry) ;
3386
+ let serialized = ron:: to_string ( & serializer) . unwrap ( ) ;
3387
+ assert_eq ! ( serialized, r#"{"bevy_reflect::tests::Point":((((1,2))))}"# ) ;
3388
+
3389
+ let mut deserializer = Deserializer :: from_str ( & serialized) . unwrap ( ) ;
3390
+ let reflect_deserializer = ReflectDeserializer :: new ( & registry) ;
3391
+ let deserialized = reflect_deserializer. deserialize ( & mut deserializer) . unwrap ( ) ;
3392
+ let point = <Point as FromReflect >:: from_reflect ( & * deserialized) . unwrap ( ) ;
3393
+ assert_eq ! ( point, Point ( external_crate:: Vector2 ( [ 1 , 2 ] ) ) ) ;
3394
+ }
3395
+
3362
3396
#[ cfg( feature = "glam" ) ]
3363
3397
mod glam {
3364
3398
use super :: * ;
0 commit comments