use config::{BincodeByteOrder, Options}; use std::io::Read;
useself::read::{BincodeRead, IoReader, SliceReader}; use byteorder::ReadBytesExt; use config::{IntEncoding, SizeLimit}; use serde; use serde::de::Error as DeError; use serde::de::IntoDeserializer; use {Error, ErrorKind, Result};
/// Specialized ways to read data into bincode. pubmod read;
/// A Deserializer that reads bytes from a buffer. /// /// This struct should rarely be used. /// In most cases, prefer the `deserialize_from` function. /// /// The ByteOrder that is chosen will impact the endianness that /// is used to read integers out of the reader. /// /// ```ignore /// let d = Deserializer::new(&mut some_reader, SizeLimit::new()); /// serde::Deserialize::deserialize(&mut deserializer); /// let bytes_read = d.bytes_read(); /// ``` pubstruct Deserializer<R, O: Options> { pub(crate) reader: R,
options: O,
}
impl<'de, IR: Read, O: Options> Deserializer<IoReader<IR>, O> { /// Creates a new Deserializer with a given `Read`er and options. pubfn with_reader(r: IR, options: O) -> Self {
Deserializer {
reader: IoReader::new(r),
options,
}
}
}
impl<'de, O: Options> Deserializer<SliceReader<'de>, O> { /// Creates a new Deserializer that will read from the given slice. pubfn from_slice(slice: &'de [u8], options: O) -> Self {
Deserializer {
reader: SliceReader::new(slice),
options,
}
}
}
impl<'de, R: BincodeRead<'de>, O: Options> Deserializer<R, O> { /// Creates a new Deserializer with the given `BincodeRead`er pubfn with_bincode_read(r: R, options: O) -> Deserializer<R, O> {
Deserializer { reader: r, options }
}
fn read_literal_type<T>(&mutself) -> Result<()> { use std::mem::size_of; self.read_bytes(size_of::<T>() as u64)
}
fn read_vec(&mutself) -> Result<Vec<u8>> { let len = O::IntEncoding::deserialize_len(self)?; self.read_bytes(len as u64)?; self.reader.get_byte_buffer(len)
}
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value> where
V: serde::de::Visitor<'de>,
{ use std::str;
let error = || ErrorKind::InvalidCharEncoding.into();
letmut buf = [0u8; 4];
// Look at the first byte to see how many bytes must be read self.reader.read_exact(&mut buf[..1])?; let width = utf8_char_width(buf[0]); if width == 1 { return visitor.visit_char(buf[0] as char);
} if width == 0 { return Err(error());
}
let res = str::from_utf8(&buf[..width])
.ok()
.and_then(|s| s.chars().next())
.ok_or_else(error)?;
visitor.visit_char(res)
}
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value> where
V: serde::de::Visitor<'de>,
{ let len = O::IntEncoding::deserialize_len(self)?; self.read_bytes(len as u64)?; self.reader.forward_read_str(len, visitor)
}
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value> where
V: serde::de::Visitor<'de>,
{ let len = O::IntEncoding::deserialize_len(self)?; self.read_bytes(len as u64)?; self.reader.forward_read_bytes(len, visitor)
}
fn deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value> where
V: serde::de::Visitor<'de>,
{ let message = "Bincode does not support Deserializer::deserialize_identifier";
Err(Error::custom(message))
}
fn deserialize_ignored_any<V>(self, _visitor: V) -> Result<V::Value> where
V: serde::de::Visitor<'de>,
{ let message = "Bincode does not support Deserializer::deserialize_ignored_any";
Err(Error::custom(message))
}
fn is_human_readable(&self) -> bool { false
}
}
impl<'de, 'a, R, O> serde::de::VariantAccess<'de> for &'a mut Deserializer<R, O> where
R: BincodeRead<'de>,
O: Options,
{ type Error = Error;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.