pub struct TypedReflectDeserializer<'a, P: ReflectDeserializerProcessor = ()> { /* private fields */ }
Expand description
A deserializer for reflected types whose TypeRegistration
is known.
This is the deserializer counterpart to TypedReflectSerializer
.
See ReflectDeserializer
for a deserializer that expects an unknown type.
§Input
Since the type is already known, the input is just 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)]
struct MyStruct {
value: i32
}
let mut registry = TypeRegistry::default();
registry.register::<MyStruct>();
let input = r#"(
value: 123
)"#;
let registration = registry.get(TypeId::of::<MyStruct>()).unwrap();
let mut deserializer = ron::Deserializer::from_str(input).unwrap();
let reflect_deserializer = TypedReflectDeserializer::new(registration, ®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> TypedReflectDeserializer<'a, ()>
impl<'a> TypedReflectDeserializer<'a, ()>
Sourcepub fn new(
registration: &'a TypeRegistration,
registry: &'a TypeRegistry,
) -> Self
pub fn new( registration: &'a TypeRegistration, registry: &'a TypeRegistry, ) -> Self
Creates a typed deserializer with no processor.
If you want to add custom logic for deserializing certain types, use
with_processor
.
Sourcepub fn of<T: TypePath>(registry: &'a TypeRegistry) -> Self
pub fn of<T: TypePath>(registry: &'a TypeRegistry) -> Self
Creates a new TypedReflectDeserializer
for the given type T
without a processor.
§Panics
Panics if T
is not registered in the given TypeRegistry
.
Source§impl<'a, P: ReflectDeserializerProcessor> TypedReflectDeserializer<'a, P>
impl<'a, P: ReflectDeserializerProcessor> TypedReflectDeserializer<'a, P>
Sourcepub fn with_processor(
registration: &'a TypeRegistration,
registry: &'a TypeRegistry,
processor: &'a mut P,
) -> Self
pub fn with_processor( registration: &'a TypeRegistration, registry: &'a TypeRegistry, processor: &'a mut P, ) -> Self
Creates a typed 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 TypedReflectDeserializer<'_, P>
impl<'de, P: ReflectDeserializerProcessor> DeserializeSeed<'de> for TypedReflectDeserializer<'_, 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 TypedReflectDeserializer<'a, P>
impl<'a, P = ()> !RefUnwindSafe for TypedReflectDeserializer<'a, P>
impl<'a, P> Send for TypedReflectDeserializer<'a, P>where
P: Send,
impl<'a, P> Sync for TypedReflectDeserializer<'a, P>where
P: Sync,
impl<'a, P> Unpin for TypedReflectDeserializer<'a, P>
impl<'a, P = ()> !UnwindSafe for TypedReflectDeserializer<'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.