mirror of https://git.sr.ht/~stygianentity/bincode
Smarter deserialize_bytes and deserialize_byte_buf (#115)
* Smarter deserialize_bytes * Make read_vec faster by pre-allocating the correct amount of space. Also, call visit_bytes in deserialize_bytes rather than visit_byte_buf.
This commit is contained in:
parent
6ece2f5866
commit
3471118004
|
|
@ -51,14 +51,19 @@ impl<R: Read> Deserializer<R> {
|
|||
self.read_bytes(size_of::<T>() as u64)
|
||||
}
|
||||
|
||||
fn read_string(&mut self) -> Result<String> {
|
||||
fn read_vec(&mut self) -> Result<Vec<u8>> {
|
||||
let len = try!(serde::Deserialize::deserialize(&mut *self));
|
||||
try!(self.read_bytes(len));
|
||||
|
||||
let mut buffer = Vec::new();
|
||||
try!(self.reader.by_ref().take(len as u64).read_to_end(&mut buffer));
|
||||
let len = len as usize;
|
||||
let mut bytes = Vec::with_capacity(len);
|
||||
unsafe { bytes.set_len(len); }
|
||||
try!(self.reader.read_exact(&mut bytes));
|
||||
Ok(bytes)
|
||||
}
|
||||
|
||||
String::from_utf8(buffer).map_err(|err|
|
||||
fn read_string(&mut self) -> Result<String> {
|
||||
String::from_utf8(try!(self.read_vec())).map_err(|err|
|
||||
ErrorKind::InvalidEncoding{
|
||||
desc: "error while decoding utf8 string",
|
||||
detail: Some(format!("Deserialize error: {}", err))
|
||||
|
|
@ -192,13 +197,13 @@ impl<'a, R: Read> serde::Deserializer for &'a mut Deserializer<R> {
|
|||
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
|
||||
where V: serde::de::Visitor,
|
||||
{
|
||||
self.deserialize_seq(visitor)
|
||||
visitor.visit_bytes(&try!(self.read_vec()))
|
||||
}
|
||||
|
||||
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
|
||||
where V: serde::de::Visitor,
|
||||
{
|
||||
self.deserialize_seq(visitor)
|
||||
visitor.visit_byte_buf(try!(self.read_vec()))
|
||||
}
|
||||
|
||||
fn deserialize_enum<V>(self,
|
||||
|
|
|
|||
Loading…
Reference in New Issue