Skip to content

Commit ad45fd5

Browse files
authored
Merge pull request #66 from twissel/master
serialization improvement
2 parents 050a71d + ddf36ce commit ad45fd5

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,4 @@ serde = { version = "1.0", optional = true, default-features = false }
2828
[dev_dependencies]
2929
# this can't yet be made optional, see https://github.com/rust-lang/cargo/issues/1596
3030
serde_json = "1.0"
31+
bincode = "1.0.1"

src/impl_serde.rs

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
//! Serde serialization/deserialization implementation
22
3-
use {ArrayLength, GenericArray};
43
use core::fmt;
54
use core::marker::PhantomData;
6-
use serde::{Deserialize, Deserializer, Serialize, Serializer};
75
use serde::de::{self, SeqAccess, Visitor};
6+
use serde::{ser::SerializeTuple, Deserialize, Deserializer, Serialize, Serializer};
7+
use {ArrayLength, GenericArray};
88

99
impl<T, N> Serialize for GenericArray<T, N>
1010
where
@@ -16,7 +16,12 @@ where
1616
where
1717
S: Serializer,
1818
{
19-
serializer.collect_seq(self.iter())
19+
let mut tup = serializer.serialize_tuple(N::to_usize())?;
20+
for el in self {
21+
tup.serialize_element(el)?;
22+
}
23+
24+
tup.end()
2025
}
2126
}
2227

@@ -42,7 +47,8 @@ where
4247
{
4348
let mut result = GenericArray::default();
4449
for i in 0..N::to_usize() {
45-
result[i] = seq.next_element()?
50+
result[i] = seq
51+
.next_element()?
4652
.ok_or_else(|| de::Error::invalid_length(i, &self))?;
4753
}
4854
Ok(result)
@@ -62,6 +68,41 @@ where
6268
_t: PhantomData,
6369
_n: PhantomData,
6470
};
65-
deserializer.deserialize_seq(visitor)
71+
deserializer.deserialize_tuple(N::to_usize(), visitor)
6672
}
6773
}
74+
75+
#[cfg(test)]
76+
mod tests {
77+
use super::*;
78+
use bincode;
79+
use typenum;
80+
81+
#[test]
82+
fn test_serialize() {
83+
let array = GenericArray::<u8, typenum::U2>::default();
84+
let serialized = bincode::serialize(&array);
85+
assert!(serialized.is_ok());
86+
}
87+
88+
#[test]
89+
fn test_deserialize() {
90+
let mut array = GenericArray::<u8, typenum::U2>::default();
91+
array[0] = 1;
92+
array[1] = 2;
93+
let serialized = bincode::serialize(&array).unwrap();
94+
let deserialized = bincode::deserialize::<GenericArray<u8, typenum::U2>>(&array);
95+
assert!(deserialized.is_ok());
96+
let array = deserialized.unwrap();
97+
assert_eq!(array[0], 1);
98+
assert_eq!(array[1], 2);
99+
}
100+
101+
#[test]
102+
fn test_serialized_size() {
103+
let array = GenericArray::<u8, typenum::U1>::default();
104+
let size = bincode::serialized_size(&array).unwrap();
105+
assert_eq!(size, 1);
106+
}
107+
108+
}

src/lib.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141

4242
#[cfg(feature = "serde")]
4343
extern crate serde;
44+
45+
#[cfg(test)]
46+
extern crate bincode;
47+
4448
pub extern crate typenum;
4549

4650
mod hex;
@@ -49,19 +53,19 @@ mod impls;
4953
#[cfg(feature = "serde")]
5054
pub mod impl_serde;
5155

52-
use core::{mem, ptr, slice};
5356
use core::iter::FromIterator;
5457
use core::marker::PhantomData;
5558
use core::mem::ManuallyDrop;
5659
use core::ops::{Deref, DerefMut};
60+
use core::{mem, ptr, slice};
5761
use typenum::bit::{B0, B1};
5862
use typenum::uint::{UInt, UTerm, Unsigned};
5963

6064
#[cfg_attr(test, macro_use)]
6165
pub mod arr;
66+
pub mod functional;
6267
pub mod iter;
6368
pub mod sequence;
64-
pub mod functional;
6569

6670
use functional::*;
6771
pub use iter::GenericArrayIter;
@@ -355,8 +359,8 @@ where
355359
mut f: F,
356360
) -> MappedSequence<GenericArray<B, Self::Length>, B, U>
357361
where
358-
GenericArray<B, Self::Length>: GenericSequence<B, Length = Self::Length>
359-
+ MappedGenericSequence<B, U>,
362+
GenericArray<B, Self::Length>:
363+
GenericSequence<B, Length = Self::Length> + MappedGenericSequence<B, U>,
360364
Self: MappedGenericSequence<T, U>,
361365
Self::Length: ArrayLength<B> + ArrayLength<U>,
362366
F: FnMut(B, Self::Item) -> U,

0 commit comments

Comments
 (0)