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