[−][src]Trait rkyv_dyn::ArchiveDyn
A trait object that can be serialized.
To add archive support for a trait object:
- Add
archive_dyn
on your trait to make an archive-compatible version of it. By default, it will be named "Archive" + your trait name. - Implement
Archive
andTypeName
for the types you want to make trait objects of. - Implement your trait for your type and add the attribute
#[archive_dyn]
to it. Make sure to implement your trait for your archived type as well.
Then you're ready to serialize boxed trait objects!
Even though your unarchived values are boxed as archive
trait objects, your archived values are boxed as regular
trait objects. This is because your unarchived values have
to implement ArchiveDyn
but your archived values do not.
Examples
See archive_dyn
for customization
options.
use rkyv::{ Aligned, Archive, ArchiveBuffer, Archived, archived_value, WriteExt, }; use rkyv_dyn::archive_dyn; use rkyv_typename::TypeName; #[archive_dyn] trait ExampleTrait { fn value(&self) -> String; } #[derive(Archive, TypeName)] struct StringStruct(String); #[archive_dyn] impl ExampleTrait for StringStruct { fn value(&self) -> String { self.0.clone() } } impl ExampleTrait for Archived<StringStruct> { fn value(&self) -> String { self.0.as_str().to_string() } } #[derive(Archive, TypeName)] struct IntStruct(i32); #[archive_dyn] impl ExampleTrait for IntStruct { fn value(&self) -> String { format!("{}", self.0) } } impl ExampleTrait for Archived<IntStruct> { fn value(&self) -> String { format!("{}", self.0) } } fn main() { let boxed_int = Box::new(IntStruct(42)) as Box<dyn ArchiveExampleTrait>; let boxed_string = Box::new(StringStruct("hello world".to_string())) as Box<dyn ArchiveExampleTrait>; let mut writer = ArchiveBuffer::new(Aligned([0u8; 256])); let int_pos = writer.archive(&boxed_int) .expect("failed to archive boxed int"); let string_pos = writer.archive(&boxed_string) .expect("failed to archive boxed string"); let buf = writer.into_inner(); let archived_int = unsafe { archived_value::<Box<dyn ArchiveExampleTrait>>(buf.as_ref(), int_pos) }; let archived_string = unsafe { archived_value::<Box<dyn ArchiveExampleTrait>>(buf.as_ref(), string_pos) }; assert_eq!(archived_int.value(), "42"); assert_eq!(archived_string.value(), "hello world"); }
Required methods
fn archive_dyn(
&self,
writer: &mut dyn DynWrite
) -> Result<DynResolver, DynError>
&self,
writer: &mut dyn DynWrite
) -> Result<DynResolver, DynError>
Writes the value to the writer and returns a resolver
that can create a ArchivedDyn
reference.
Implementors
impl<T: Archive + TypeName> ArchiveDyn for T
[src]
fn archive_dyn(
&self,
writer: &mut dyn DynWrite
) -> Result<DynResolver, DynError>
[src]
&self,
writer: &mut dyn DynWrite
) -> Result<DynResolver, DynError>