More efficient serialize_bytes (#90)
* Update to serde_derive * Fix missing Encoder and Decoder imports * Add test for serializing bytes * More efficient serialize_bytes Reported in #serde: blank_name2 tried serializing `HashMap<String, HashSet<Bytes>>` vs `HashMap<String, HashSet<&Path>>`, the `&Path` version was done in ~.6 seconds while the `&[u8]` one took a full 3 seconds more.
This commit is contained in:
parent
8d708cd194
commit
3d4346808f
|
|
@ -23,7 +23,7 @@ version = "0.8.*"
|
||||||
optional = true
|
optional = true
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serde_macros = "0.8.*"
|
serde_derive = "0.8.*"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["rustc-serialize", "serde"]
|
default = ["rustc-serialize", "serde"]
|
||||||
|
|
|
||||||
|
|
@ -163,11 +163,8 @@ impl<'a, W: Write> serde::Serializer for Serializer<'a, W> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_bytes(&mut self, v: &[u8]) -> SerializeResult<()> {
|
fn serialize_bytes(&mut self, v: &[u8]) -> SerializeResult<()> {
|
||||||
let mut state = try!(self.serialize_seq(Some(v.len())));
|
try!(self.serialize_usize(v.len()));
|
||||||
for c in v {
|
self.writer.write_all(v).map_err(SerializeError::IoError)
|
||||||
try!(self.serialize_seq_elt(&mut state, c));
|
|
||||||
}
|
|
||||||
self.serialize_seq_end(state)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_none(&mut self) -> SerializeResult<()> {
|
fn serialize_none(&mut self) -> SerializeResult<()> {
|
||||||
|
|
@ -440,11 +437,8 @@ impl serde::Serializer for SizeChecker {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_bytes(&mut self, v: &[u8]) -> SerializeResult<()> {
|
fn serialize_bytes(&mut self, v: &[u8]) -> SerializeResult<()> {
|
||||||
let mut state = try!(self.serialize_seq(Some(v.len())));
|
try!(self.add_value(0 as u64));
|
||||||
for c in v {
|
self.add_raw(v.len())
|
||||||
try!(self.serialize_seq_elt(&mut state, c));
|
|
||||||
}
|
|
||||||
self.serialize_seq_end(state)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_none(&mut self) -> SerializeResult<()> {
|
fn serialize_none(&mut self) -> SerializeResult<()> {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
#![feature(plugin, custom_derive, custom_attribute)]
|
#![feature(proc_macro)]
|
||||||
#![plugin(serde_macros)]
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate serde_derive;
|
||||||
|
|
||||||
extern crate bincode;
|
extern crate bincode;
|
||||||
extern crate rustc_serialize;
|
extern crate rustc_serialize;
|
||||||
|
|
@ -9,7 +11,7 @@ use std::fmt::Debug;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
use rustc_serialize::{Encodable, Decodable};
|
use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
|
||||||
|
|
||||||
use bincode::{RefBox, StrBox, SliceBox};
|
use bincode::{RefBox, StrBox, SliceBox};
|
||||||
|
|
||||||
|
|
@ -516,6 +518,18 @@ fn path_buf() {
|
||||||
assert!(path.to_str() == decoded.to_str());
|
assert!(path.to_str() == decoded.to_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bytes() {
|
||||||
|
let data = b"abc\0123";
|
||||||
|
let b = bincode::rustc_serialize::encode(&data, Infinite).unwrap();
|
||||||
|
let s = bincode::serde::serialize(&data, Infinite).unwrap();
|
||||||
|
assert_eq!(b, s);
|
||||||
|
|
||||||
|
use serde::bytes::Bytes;
|
||||||
|
let s2 = bincode::serde::serialize(&Bytes::new(data), Infinite).unwrap();
|
||||||
|
assert_eq!(s, s2);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_manual_enum_encoding() {
|
fn test_manual_enum_encoding() {
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue