pub struct ReflectDeserializer<'a, P: ReflectDeserializerProcessor = ()> { /* private fields */ }
Expand description
A general purpose deserializer for reflected types.
This is the deserializer counterpart to ReflectSerializer
.
See TypedReflectDeserializer
for a deserializer that expects a known type.
§Input
This deserializer expects a map with a single entry, where the key is the full type path of the reflected type and the value is the serialized data.
§Output
This deserializer will return a Box<dyn Reflect>
containing the deserialized data.
For opaque types (i.e. ReflectKind::Opaque
) or types that register ReflectDeserialize
type data,
this Box
will contain the expected type.
For example, deserializing an i32
will return a Box<i32>
(as a Box<dyn Reflect>
).
Otherwise, this Box
will contain the dynamic equivalent.
For example, a deserialized struct might return a Box<DynamicStruct>
and a deserialized Vec
might return a Box<DynamicList>
.
This means that if the actual type is needed, these dynamic representations will need to
be converted to the concrete type using FromReflect
or ReflectFromReflect
.
If you want to override deserialization for a specific TypeRegistration
,
you can pass in a reference to a ReflectDeserializerProcessor
which will
take priority over all other deserialization methods - see with_processor
.
§Example
#[derive(Reflect, PartialEq, Debug)]
#[type_path = "my_crate"]
struct MyStruct {
value: i32
}
let mut registry = TypeRegistry::default();
registry.register::<MyStruct>();
let input = r#"{
"my_crate::MyStruct": (
value: 123
)
}"#;
let mut deserializer = ron::Deserializer::from_str(input).unwrap();
let reflect_deserializer = ReflectDeserializer::new(®istry);
let output: Box<dyn PartialReflect> = reflect_deserializer.deserialize(&mut deserializer).unwrap();
// Since `MyStruct` is not an opaque type and does not register `ReflectDeserialize`,
// we know that its deserialized value will be a `DynamicStruct`,
// although it will represent `MyStruct`.
assert!(output.as_partial_reflect().represents::<MyStruct>());
// We can convert back to `MyStruct` using `FromReflect`.
let value: MyStruct = <MyStruct as FromReflect>::from_reflect(output.as_partial_reflect()).unwrap();
assert_eq!(value, MyStruct { value: 123 });
// We can also do this dynamically with `ReflectFromReflect`.
let type_id = output.get_represented_type_info().unwrap().type_id();
let reflect_from_reflect = registry.get_type_data::<ReflectFromReflect>(type_id).unwrap();
let value: Box<dyn Reflect> = reflect_from_reflect.from_reflect(output.as_partial_reflect()).unwrap();
assert!(value.is::<MyStruct>());
assert_eq!(value.take::<MyStruct>().unwrap(), MyStruct { value: 123 });
Implementations§
Source§impl<'a> ReflectDeserializer<'a, ()>
impl<'a> ReflectDeserializer<'a, ()>
Sourcepub fn new(registry: &'a TypeRegistry) -> Self
pub fn new(registry: &'a TypeRegistry) -> Self
Creates a deserializer with no processor.
If you want to add custom logic for deserializing certain types, use
with_processor
.
Source§impl<'a, P: ReflectDeserializerProcessor> ReflectDeserializer<'a, P>
impl<'a, P: ReflectDeserializerProcessor> ReflectDeserializer<'a, P>
Sourcepub fn with_processor(registry: &'a TypeRegistry, processor: &'a mut P) -> Self
pub fn with_processor(registry: &'a TypeRegistry, processor: &'a mut P) -> Self
Creates a deserializer with a processor.
If you do not need any custom logic for handling certain types, use
new
.
Trait Implementations§
Source§impl<'de, P: ReflectDeserializerProcessor> DeserializeSeed<'de> for ReflectDeserializer<'_, P>
impl<'de, P: ReflectDeserializerProcessor> DeserializeSeed<'de> for ReflectDeserializer<'_, P>
Source§type Value = Box<dyn PartialReflect>
type Value = Box<dyn PartialReflect>
Source§fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>where
D: Deserializer<'de>,
Deserialize::deserialize
method, except
with some initial piece of data (the seed) passed in.Auto Trait Implementations§
impl<'a, P> Freeze for ReflectDeserializer<'a, P>
impl<'a, P = ()> !RefUnwindSafe for ReflectDeserializer<'a, P>
impl<'a, P> Send for ReflectDeserializer<'a, P>where
P: Send,
impl<'a, P> Sync for ReflectDeserializer<'a, P>where
P: Sync,
impl<'a, P> Unpin for ReflectDeserializer<'a, P>
impl<'a, P = ()> !UnwindSafe for ReflectDeserializer<'a, P>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.