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:
Tim 2017-02-23 12:31:59 -08:00 committed by Ty Overby
parent 6ece2f5866
commit 3471118004
1 changed files with 11 additions and 6 deletions

View File

@ -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,