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)
|
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));
|
let len = try!(serde::Deserialize::deserialize(&mut *self));
|
||||||
try!(self.read_bytes(len));
|
try!(self.read_bytes(len));
|
||||||
|
|
||||||
let mut buffer = Vec::new();
|
let len = len as usize;
|
||||||
try!(self.reader.by_ref().take(len as u64).read_to_end(&mut buffer));
|
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{
|
ErrorKind::InvalidEncoding{
|
||||||
desc: "error while decoding utf8 string",
|
desc: "error while decoding utf8 string",
|
||||||
detail: Some(format!("Deserialize error: {}", err))
|
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>
|
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
|
||||||
where V: serde::de::Visitor,
|
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>
|
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
|
||||||
where V: serde::de::Visitor,
|
where V: serde::de::Visitor,
|
||||||
{
|
{
|
||||||
self.deserialize_seq(visitor)
|
visitor.visit_byte_buf(try!(self.read_vec()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_enum<V>(self,
|
fn deserialize_enum<V>(self,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue