[−][src]Function zvariant::from_slice_for_signature
pub fn from_slice_for_signature<'d, 'r: 'd, B, T: ?Sized>(
bytes: &'r [u8],
ctxt: EncodingContext<B>,
signature: &Signature<'_>
) -> Result<T> where
B: ByteOrder,
T: Deserialize<'d>,
Deserialize T
from a given slice of bytes with the given signature.
Use this function instead of from_slice
if the value being deserialized does not implement
Type
. Also, if T
is an, or (potentially) contains an Fd
, use
from_slice_fds_for_signature
instead.
Examples
One known case where Type
implementation isn't possible, is enum types (except simple ones
with unit variants only).
use std::convert::TryInto; use serde::{Deserialize, Serialize}; use zvariant::{to_bytes_for_signature, from_slice_for_signature}; use zvariant::EncodingContext; #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] enum Test { Unit, NewType(u8), Tuple(u8, u64), Struct { y: u8, t: u64 }, } let ctxt = EncodingContext::<byteorder::LE>::new_dbus(0); let signature = "u".try_into().unwrap(); let encoded = to_bytes_for_signature(ctxt, &signature, &Test::Unit).unwrap(); let decoded: Test = from_slice_for_signature(&encoded, ctxt, &signature).unwrap(); assert_eq!(decoded, Test::Unit); let signature = "y".try_into().unwrap(); let encoded = to_bytes_for_signature(ctxt, &signature, &Test::NewType(42)).unwrap(); let decoded: Test = from_slice_for_signature(&encoded, ctxt, &signature).unwrap(); assert_eq!(decoded, Test::NewType(42)); let signature = "(yt)".try_into().unwrap(); let encoded = to_bytes_for_signature(ctxt, &signature, &Test::Tuple(42, 42)).unwrap(); let decoded: Test = from_slice_for_signature(&encoded, ctxt, &signature).unwrap(); assert_eq!(decoded, Test::Tuple(42, 42)); let s = Test::Struct { y: 42, t: 42 }; let encoded = to_bytes_for_signature(ctxt, &signature, &s).unwrap(); let decoded: Test = from_slice_for_signature(&encoded, ctxt, &signature).unwrap(); assert_eq!(decoded, Test::Struct { y: 42, t: 42 });