Trait Archive

Source
pub trait Archive {
    type Archived;
    type Resolver;

    // Required method
    unsafe fn resolve(
        &self,
        pos: usize,
        resolver: Self::Resolver,
        out: *mut Self::Archived,
    );
}
Expand description

A type that can be used without deserializing.

Archive is one of three basic traits used to work with zero-copy data and controls the layout of the data in its archived zero-copy representation. The Serialize trait helps transform types into that representation, and the Deserialize trait helps transform types back out.

Types that implement Archive must have a well-defined archived size. Unsized types can be supported using the ArchiveUnsized trait, along with SerializeUnsized and DeserializeUnsized.

Archiving is done depth-first, writing any data owned by a type before writing the data for the type itself. The type must be able to create the archived type from only its own data and its resolver.

Archived data is always treated as if it is tree-shaped, with the root owning its direct descendents and so on. Data that is not tree-shaped can be supported using special serializer and deserializer bounds (see ArchivedRc for example). In a buffer of serialized data, objects are laid out in reverse order. This means that the root object is located near the end of the buffer and leaf objects are located near the beginning.

§Examples

Most of the time, #[derive(Archive)] will create an acceptable implementation. You can use the #[archive(...)] and #[archive_attr(...)] attributes to control how the implementation is generated. See the Archive derive macro for more details.

use rkyv::{Archive, Deserialize, Serialize};

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
// This will generate a PartialEq impl between our unarchived and archived types
#[archive(compare(PartialEq))]
// We can pass attributes through to generated types with archive_attr
#[archive_attr(derive(Debug))]
struct Test {
    int: u8,
    string: String,
    option: Option<Vec<i32>>,
}

let value = Test {
    int: 42,
    string: "hello world".to_string(),
    option: Some(vec![1, 2, 3, 4]),
};

// Serializing is as easy as a single function call
let bytes = rkyv::to_bytes::<_, 256>(&value).unwrap();

// Or you can customize your serialization for better performance
// and compatibility with #![no_std] environments
use rkyv::ser::{Serializer, serializers::AllocSerializer};

let mut serializer = AllocSerializer::<0>::default();
serializer.serialize_value(&value).unwrap();
let bytes = serializer.into_serializer().into_inner();

// You can use the safe API with the validation feature turned on,
// or you can use the unsafe API (shown here) for maximum performance
let archived = unsafe { rkyv::archived_root::<Test>(&bytes[..]) };
assert_eq!(archived, &value);

// And you can always deserialize back to the original type
let deserialized: Test = archived.deserialize(&mut rkyv::Infallible).unwrap();
assert_eq!(deserialized, value);

Note: the safe API requires the validation feature.

Many of the core and standard library types already have Archive implementations available, but you may need to implement Archive for your own types in some cases the derive macro cannot handle.

In this example, we add our own wrapper that serializes a &'static str as if it’s owned. Normally you can lean on the archived version of String to do most of the work, or use the Inline to do exactly this. This example does everything to demonstrate how to implement Archive for your own types.

use core::{slice, str};
use rkyv::{
    archived_root,
    ser::{Serializer, serializers::AlignedSerializer},
    out_field,
    AlignedVec,
    Archive,
    Archived,
    ArchiveUnsized,
    MetadataResolver,
    RelPtr,
    Serialize,
    SerializeUnsized,
};

struct OwnedStr {
    inner: &'static str,
}

struct ArchivedOwnedStr {
    // This will be a relative pointer to our string
    ptr: RelPtr<str>,
}

impl ArchivedOwnedStr {
    // This will help us get the bytes of our type as a str again.
    fn as_str(&self) -> &str {
        unsafe {
            // The as_ptr() function of RelPtr will get a pointer the str
            &*self.ptr.as_ptr()
        }
    }
}

struct OwnedStrResolver {
    // This will be the position that the bytes of our string are stored at.
    // We'll use this to resolve the relative pointer of our
    // ArchivedOwnedStr.
    pos: usize,
    // The archived metadata for our str may also need a resolver.
    metadata_resolver: MetadataResolver<str>,
}

// The Archive implementation defines the archived version of our type and
// determines how to turn the resolver into the archived form. The Serialize
// implementations determine how to make a resolver from the original value.
impl Archive for OwnedStr {
    type Archived = ArchivedOwnedStr;
    // This is the resolver we can create our Archived version from.
    type Resolver = OwnedStrResolver;

    // The resolve function consumes the resolver and produces the archived
    // value at the given position.
    unsafe fn resolve(
        &self,
        pos: usize,
        resolver: Self::Resolver,
        out: *mut Self::Archived,
    ) {
        // We have to be careful to add the offset of the ptr field,
        // otherwise we'll be using the position of the ArchivedOwnedStr
        // instead of the position of the relative pointer.
        let (fp, fo) = out_field!(out.ptr);
        self.inner.resolve_unsized(
            pos + fp,
            resolver.pos,
            resolver.metadata_resolver,
            fo,
        );
    }
}

// We restrict our serializer types with Serializer because we need its
// capabilities to archive our type. For other types, we might need more or
// less restrictive bounds on the type of S.
impl<S: Serializer + ?Sized> Serialize<S> for OwnedStr {
    fn serialize(
        &self,
        serializer: &mut S
    ) -> Result<Self::Resolver, S::Error> {
        // This is where we want to write the bytes of our string and return
        // a resolver that knows where those bytes were written.
        // We also need to serialize the metadata for our str.
        Ok(OwnedStrResolver {
            pos: self.inner.serialize_unsized(serializer)?,
            metadata_resolver: self.inner.serialize_metadata(serializer)?
        })
    }
}

let mut serializer = AlignedSerializer::new(AlignedVec::new());
const STR_VAL: &'static str = "I'm in an OwnedStr!";
let value = OwnedStr { inner: STR_VAL };
// It works!
serializer.serialize_value(&value).expect("failed to archive test");
let buf = serializer.into_inner();
let archived = unsafe { archived_root::<OwnedStr>(buf.as_ref()) };
// Let's make sure our data got written correctly
assert_eq!(archived.as_str(), STR_VAL);

Required Associated Types§

Source

type Archived

The archived representation of this type.

In this form, the data can be used with zero-copy deserialization.

Source

type Resolver

The resolver for this type. It must contain all the additional information from serializing needed to make the archived type from the normal type.

Required Methods§

Source

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Creates the archived version of this value at the given position and writes it to the given output.

The output should be initialized field-by-field rather than by writing a whole struct. Performing a typed copy will mark all of the padding bytes as uninitialized, but they must remain set to the value they currently have. This prevents leaking uninitialized memory to the final archive.

§Safety
  • pos must be the position of out within the archive
  • resolver must be the result of serializing this object

Implementations on Foreign Types§

Source§

impl Archive for IpAddr

Source§

type Archived = ArchivedIpAddr

Source§

type Resolver = ()

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl Archive for SocketAddr

Source§

type Archived = ArchivedSocketAddr

Source§

type Resolver = ()

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl Archive for bool

Source§

type Archived = bool

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for char

Source§

type Archived = char

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for f32

Source§

type Archived = f32

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for f64

Source§

type Archived = f64

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i8

Source§

type Archived = i8

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i16

Source§

type Archived = i16

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i32

Source§

type Archived = i32

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i64

Source§

type Archived = i64

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i128

Source§

type Archived = i128

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for isize

Source§

type Archived = <i32 as Archive>::Archived

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u8

Source§

type Archived = u8

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u16

Source§

type Archived = u16

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u32

Source§

type Archived = u32

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u64

Source§

type Archived = u64

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u128

Source§

type Archived = u128

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for ()

Source§

type Archived = ()

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for usize

Source§

type Archived = <u32 as Archive>::Archived

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for CString

Source§

type Archived = ArchivedCString

Source§

type Resolver = CStringResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl Archive for String

Source§

type Archived = ArchivedString

Source§

type Resolver = StringResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl Archive for PhantomPinned

Source§

type Archived = PhantomPinned

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, _: *mut Self::Archived)

Source§

impl Archive for Ipv4Addr

Source§

type Archived = ArchivedIpv4Addr

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for Ipv6Addr

Source§

type Archived = ArchivedIpv6Addr

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for SocketAddrV4

Source§

type Archived = ArchivedSocketAddrV4

Source§

type Resolver = ()

Source§

unsafe fn resolve( &self, pos: usize, _: Self::Resolver, out: *mut Self::Archived, )

Source§

impl Archive for SocketAddrV6

Source§

type Archived = ArchivedSocketAddrV6

Source§

type Resolver = ()

Source§

unsafe fn resolve( &self, pos: usize, _: Self::Resolver, out: *mut Self::Archived, )

Source§

impl Archive for RangeFull

Source§

type Archived = RangeFull

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, _: *mut Self::Archived)

Source§

impl Archive for AtomicBool

Source§

type Archived = bool

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI8

Source§

type Archived = i8

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI16

Source§

type Archived = i16

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI32

Source§

type Archived = i32

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI64

Source§

type Archived = i64

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicIsize

Source§

type Archived = <i32 as Archive>::Archived

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU8

Source§

type Archived = u8

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU16

Source§

type Archived = u16

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU32

Source§

type Archived = u32

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU64

Source§

type Archived = u64

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicUsize

Source§

type Archived = <u32 as Archive>::Archived

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for Duration

Source§

type Archived = ArchivedDuration

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI8

Source§

type Archived = NonZero<i8>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI16

Source§

type Archived = NonZero<i16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI32

Source§

type Archived = NonZero<i32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI64

Source§

type Archived = NonZero<i64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI128

Source§

type Archived = NonZero<i128>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroIsize

Source§

type Archived = <NonZero<i32> as Archive>::Archived

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU8

Source§

type Archived = NonZero<u8>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU16

Source§

type Archived = NonZero<u16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU32

Source§

type Archived = NonZero<u32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU64

Source§

type Archived = NonZero<u64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU128

Source§

type Archived = NonZero<u128>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroUsize

Source§

type Archived = <NonZero<u32> as Archive>::Archived

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI16_be

Source§

type Archived = BigEndian<i16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI16_le

Source§

type Archived = LittleEndian<i16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI32_be

Source§

type Archived = BigEndian<i32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI32_le

Source§

type Archived = LittleEndian<i32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI64_be

Source§

type Archived = BigEndian<i64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicI64_le

Source§

type Archived = LittleEndian<i64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU16_be

Source§

type Archived = BigEndian<u16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU16_le

Source§

type Archived = LittleEndian<u16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU32_be

Source§

type Archived = BigEndian<u32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU32_le

Source§

type Archived = LittleEndian<u32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU64_be

Source§

type Archived = BigEndian<u64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for AtomicU64_le

Source§

type Archived = LittleEndian<u64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI16_be

Source§

type Archived = BigEndian<NonZero<i16>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI16_le

Source§

type Archived = LittleEndian<NonZero<i16>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI32_be

Source§

type Archived = BigEndian<NonZero<i32>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI32_le

Source§

type Archived = LittleEndian<NonZero<i32>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI64_be

Source§

type Archived = BigEndian<NonZero<i64>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI64_le

Source§

type Archived = LittleEndian<NonZero<i64>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI128_be

Source§

type Archived = BigEndian<NonZero<i128>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroI128_le

Source§

type Archived = LittleEndian<NonZero<i128>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU16_be

Source§

type Archived = BigEndian<NonZero<u16>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU16_le

Source§

type Archived = LittleEndian<NonZero<u16>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU32_be

Source§

type Archived = BigEndian<NonZero<u32>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU32_le

Source§

type Archived = LittleEndian<NonZero<u32>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU64_be

Source§

type Archived = BigEndian<NonZero<u64>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU64_le

Source§

type Archived = LittleEndian<NonZero<u64>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU128_be

Source§

type Archived = BigEndian<NonZero<u128>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for NonZeroU128_le

Source§

type Archived = LittleEndian<NonZero<u128>>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for char_be

Source§

type Archived = BigEndian<char>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for char_le

Source§

type Archived = LittleEndian<char>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for f32_be

Source§

type Archived = BigEndian<f32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for f32_le

Source§

type Archived = LittleEndian<f32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for f64_be

Source§

type Archived = BigEndian<f64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for f64_le

Source§

type Archived = LittleEndian<f64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i16_be

Source§

type Archived = BigEndian<i16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i16_le

Source§

type Archived = LittleEndian<i16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i32_be

Source§

type Archived = BigEndian<i32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i32_le

Source§

type Archived = LittleEndian<i32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i64_be

Source§

type Archived = BigEndian<i64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i64_le

Source§

type Archived = LittleEndian<i64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i128_be

Source§

type Archived = BigEndian<i128>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for i128_le

Source§

type Archived = LittleEndian<i128>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u16_be

Source§

type Archived = BigEndian<u16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u16_le

Source§

type Archived = LittleEndian<u16>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u32_be

Source§

type Archived = BigEndian<u32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u32_le

Source§

type Archived = LittleEndian<u32>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u64_be

Source§

type Archived = BigEndian<u64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u64_le

Source§

type Archived = LittleEndian<u64>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u128_be

Source§

type Archived = BigEndian<u128>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl Archive for u128_le

Source§

type Archived = LittleEndian<u128>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived)

Source§

impl<K: Archive + Ord> Archive for BTreeSet<K>
where K::Archived: Ord,

Source§

type Archived = ArchivedBTreeSet<<K as Archive>::Archived>

Source§

type Resolver = BTreeSetResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<K: Archive + Ord, V: Archive> Archive for BTreeMap<K, V>
where K::Archived: Ord,

Source§

type Archived = ArchivedBTreeMap<<K as Archive>::Archived, <V as Archive>::Archived>

Source§

type Resolver = BTreeMapResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<K: Archive + Hash + Eq, S> Archive for HashSet<K, S>
where K::Archived: Hash + Eq,

Source§

type Archived = ArchivedHashSet<<K as Archive>::Archived>

Source§

type Resolver = HashSetResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<K: Archive + Hash + Eq, S> Archive for HashSet<K, S>
where K::Archived: Hash + Eq,

Source§

type Archived = ArchivedHashSet<<K as Archive>::Archived>

Source§

type Resolver = HashSetResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<K: Archive + Hash + Eq, V: Archive, S> Archive for HashMap<K, V, S>
where K::Archived: Hash + Eq,

Source§

type Archived = ArchivedHashMap<<K as Archive>::Archived, <V as Archive>::Archived>

Source§

type Resolver = HashMapResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<K: Archive + Hash + Eq, V: Archive, S> Archive for HashMap<K, V, S>
where K::Archived: Hash + Eq,

Source§

type Archived = ArchivedHashMap<<K as Archive>::Archived, <V as Archive>::Archived>

Source§

type Resolver = HashMapResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T0: Archive> Archive for (T0,)

Source§

type Archived = (<T0 as Archive>::Archived,)

Source§

type Resolver = (<T0 as Archive>::Resolver,)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T1: Archive, T0: Archive> Archive for (T1, T0)

Source§

type Archived = (<T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T2: Archive, T1: Archive, T0: Archive> Archive for (T2, T1, T0)

Source§

type Archived = (<T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T3, T2, T1, T0)

Source§

type Archived = (<T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T4: Archive, T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T4, T3, T2, T1, T0)

Source§

type Archived = (<T4 as Archive>::Archived, <T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T4 as Archive>::Resolver, <T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T5: Archive, T4: Archive, T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T5, T4, T3, T2, T1, T0)

Source§

type Archived = (<T5 as Archive>::Archived, <T4 as Archive>::Archived, <T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T5 as Archive>::Resolver, <T4 as Archive>::Resolver, <T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T6: Archive, T5: Archive, T4: Archive, T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T6, T5, T4, T3, T2, T1, T0)

Source§

type Archived = (<T6 as Archive>::Archived, <T5 as Archive>::Archived, <T4 as Archive>::Archived, <T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T6 as Archive>::Resolver, <T5 as Archive>::Resolver, <T4 as Archive>::Resolver, <T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T7: Archive, T6: Archive, T5: Archive, T4: Archive, T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Archived = (<T7 as Archive>::Archived, <T6 as Archive>::Archived, <T5 as Archive>::Archived, <T4 as Archive>::Archived, <T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T7 as Archive>::Resolver, <T6 as Archive>::Resolver, <T5 as Archive>::Resolver, <T4 as Archive>::Resolver, <T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T8: Archive, T7: Archive, T6: Archive, T5: Archive, T4: Archive, T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Archived = (<T8 as Archive>::Archived, <T7 as Archive>::Archived, <T6 as Archive>::Archived, <T5 as Archive>::Archived, <T4 as Archive>::Archived, <T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T8 as Archive>::Resolver, <T7 as Archive>::Resolver, <T6 as Archive>::Resolver, <T5 as Archive>::Resolver, <T4 as Archive>::Resolver, <T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T9: Archive, T8: Archive, T7: Archive, T6: Archive, T5: Archive, T4: Archive, T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Archived = (<T9 as Archive>::Archived, <T8 as Archive>::Archived, <T7 as Archive>::Archived, <T6 as Archive>::Archived, <T5 as Archive>::Archived, <T4 as Archive>::Archived, <T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T9 as Archive>::Resolver, <T8 as Archive>::Resolver, <T7 as Archive>::Resolver, <T6 as Archive>::Resolver, <T5 as Archive>::Resolver, <T4 as Archive>::Resolver, <T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T10: Archive, T9: Archive, T8: Archive, T7: Archive, T6: Archive, T5: Archive, T4: Archive, T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Archived = (<T10 as Archive>::Archived, <T9 as Archive>::Archived, <T8 as Archive>::Archived, <T7 as Archive>::Archived, <T6 as Archive>::Archived, <T5 as Archive>::Archived, <T4 as Archive>::Archived, <T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T10 as Archive>::Resolver, <T9 as Archive>::Resolver, <T8 as Archive>::Resolver, <T7 as Archive>::Resolver, <T6 as Archive>::Resolver, <T5 as Archive>::Resolver, <T4 as Archive>::Resolver, <T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T11: Archive, T10: Archive, T9: Archive, T8: Archive, T7: Archive, T6: Archive, T5: Archive, T4: Archive, T3: Archive, T2: Archive, T1: Archive, T0: Archive> Archive for (T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Archived = (<T11 as Archive>::Archived, <T10 as Archive>::Archived, <T9 as Archive>::Archived, <T8 as Archive>::Archived, <T7 as Archive>::Archived, <T6 as Archive>::Archived, <T5 as Archive>::Archived, <T4 as Archive>::Archived, <T3 as Archive>::Archived, <T2 as Archive>::Archived, <T1 as Archive>::Archived, <T0 as Archive>::Archived)

Source§

type Resolver = (<T11 as Archive>::Resolver, <T10 as Archive>::Resolver, <T9 as Archive>::Resolver, <T8 as Archive>::Resolver, <T7 as Archive>::Resolver, <T6 as Archive>::Resolver, <T5 as Archive>::Resolver, <T4 as Archive>::Resolver, <T3 as Archive>::Resolver, <T2 as Archive>::Resolver, <T1 as Archive>::Resolver, <T0 as Archive>::Resolver)

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive> Archive for Option<T>

Source§

type Archived = ArchivedOption<<T as Archive>::Archived>

Source§

type Resolver = Option<<T as Archive>::Resolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive> Archive for Vec<T>

Source§

type Archived = ArchivedVec<<T as Archive>::Archived>

Source§

type Resolver = VecResolver

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive> Archive for Range<T>

Source§

type Archived = ArchivedRange<<T as Archive>::Archived>

Source§

type Resolver = Range<<T as Archive>::Resolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive> Archive for RangeFrom<T>

Source§

type Archived = ArchivedRangeFrom<<T as Archive>::Archived>

Source§

type Resolver = RangeFrom<<T as Archive>::Resolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive> Archive for RangeInclusive<T>

Source§

type Archived = ArchivedRangeInclusive<<T as Archive>::Archived>

Source§

type Resolver = Range<<T as Archive>::Resolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive> Archive for RangeTo<T>

Source§

type Archived = ArchivedRangeTo<<T as Archive>::Archived>

Source§

type Resolver = RangeTo<<T as Archive>::Resolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive> Archive for RangeToInclusive<T>

Source§

type Archived = ArchivedRangeToInclusive<<T as Archive>::Archived>

Source§

type Resolver = RangeToInclusive<<T as Archive>::Resolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive, E: Archive> Archive for Result<T, E>

Source§

type Archived = ArchivedResult<<T as Archive>::Archived, <E as Archive>::Archived>

Source§

type Resolver = Result<<T as Archive>::Resolver, <E as Archive>::Resolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: Archive, const N: usize> Archive for [T; N]

Source§

type Archived = [<T as Archive>::Archived; N]

Source§

type Resolver = [<T as Archive>::Resolver; N]

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: ArchiveUnsized + ?Sized> Archive for Box<T>

Source§

impl<T: ArchiveUnsized + ?Sized> Archive for Rc<T>

Source§

type Archived = ArchivedRc<<T as ArchiveUnsized>::Archived, RcFlavor>

Source§

type Resolver = RcResolver<<T as ArchiveUnsized>::MetadataResolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: ArchiveUnsized + ?Sized> Archive for Weak<T>

Source§

type Archived = ArchivedRcWeak<<T as ArchiveUnsized>::Archived, RcFlavor>

Source§

type Resolver = RcWeakResolver<<T as ArchiveUnsized>::MetadataResolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: ArchiveUnsized + ?Sized> Archive for Arc<T>

Source§

type Archived = ArchivedRc<<T as ArchiveUnsized>::Archived, ArcFlavor>

Source§

type Resolver = RcResolver<<T as ArchiveUnsized>::MetadataResolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: ArchiveUnsized + ?Sized> Archive for Weak<T>

Source§

type Archived = ArchivedRcWeak<<T as ArchiveUnsized>::Archived, ArcFlavor>

Source§

type Resolver = RcWeakResolver<<T as ArchiveUnsized>::MetadataResolver>

Source§

unsafe fn resolve( &self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived, )

Source§

impl<T: ?Sized> Archive for PhantomData<T>

Source§

type Archived = PhantomData<T>

Source§

type Resolver = ()

Source§

unsafe fn resolve(&self, _: usize, _: Self::Resolver, _: *mut Self::Archived)

Implementors§