+++ /dev/null
-//! Serde serialization/deserialization implementation\r
-\r
-use core::fmt;\r
-use core::marker::PhantomData;\r
-use serde::de::{self, SeqAccess, Visitor};\r
-use serde::{ser::SerializeTuple, Deserialize, Deserializer, Serialize, Serializer};\r
-use {ArrayLength, GenericArray};\r
-\r
-impl<T, N> Serialize for GenericArray<T, N>\r
-where\r
- T: Serialize,\r
- N: ArrayLength<T>,\r
-{\r
- #[inline]\r
- fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\r
- where\r
- S: Serializer,\r
- {\r
- let mut tup = serializer.serialize_tuple(N::to_usize())?;\r
- for el in self {\r
- tup.serialize_element(el)?;\r
- }\r
-\r
- tup.end()\r
- }\r
-}\r
-\r
-struct GAVisitor<T, N> {\r
- _t: PhantomData<T>,\r
- _n: PhantomData<N>,\r
-}\r
-\r
-impl<'de, T, N> Visitor<'de> for GAVisitor<T, N>\r
-where\r
- T: Deserialize<'de> + Default,\r
- N: ArrayLength<T>,\r
-{\r
- type Value = GenericArray<T, N>;\r
-\r
- fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {\r
- formatter.write_str("struct GenericArray")\r
- }\r
-\r
- fn visit_seq<A>(self, mut seq: A) -> Result<GenericArray<T, N>, A::Error>\r
- where\r
- A: SeqAccess<'de>,\r
- {\r
- let mut result = GenericArray::default();\r
- for i in 0..N::to_usize() {\r
- result[i] = seq\r
- .next_element()?\r
- .ok_or_else(|| de::Error::invalid_length(i, &self))?;\r
- }\r
- Ok(result)\r
- }\r
-}\r
-\r
-impl<'de, T, N> Deserialize<'de> for GenericArray<T, N>\r
-where\r
- T: Deserialize<'de> + Default,\r
- N: ArrayLength<T>,\r
-{\r
- fn deserialize<D>(deserializer: D) -> Result<GenericArray<T, N>, D::Error>\r
- where\r
- D: Deserializer<'de>,\r
- {\r
- let visitor = GAVisitor {\r
- _t: PhantomData,\r
- _n: PhantomData,\r
- };\r
- deserializer.deserialize_tuple(N::to_usize(), visitor)\r
- }\r
-}\r
-\r
-#[cfg(test)]\r
-mod tests {\r
- use super::*;\r
- use bincode;\r
- use typenum;\r
-\r
- #[test]\r
- fn test_serialize() {\r
- let array = GenericArray::<u8, typenum::U2>::default();\r
- let serialized = bincode::serialize(&array);\r
- assert!(serialized.is_ok());\r
- }\r
-\r
- #[test]\r
- fn test_deserialize() {\r
- let mut array = GenericArray::<u8, typenum::U2>::default();\r
- array[0] = 1;\r
- array[1] = 2;\r
- let serialized = bincode::serialize(&array).unwrap();\r
- let deserialized = bincode::deserialize::<GenericArray<u8, typenum::U2>>(&array);\r
- assert!(deserialized.is_ok());\r
- let array = deserialized.unwrap();\r
- assert_eq!(array[0], 1);\r
- assert_eq!(array[1], 2);\r
- }\r
-\r
- #[test]\r
- fn test_serialized_size() {\r
- let array = GenericArray::<u8, typenum::U1>::default();\r
- let size = bincode::serialized_size(&array).unwrap();\r
- assert_eq!(size, 1);\r
- }\r
-\r
-}\r