diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 21f557f93..eefe3215d 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -625,9 +625,7 @@ impl ArrayVisitor { } } -impl<'de, T> Visitor<'de> for ArrayVisitor<[T; 0]> - where T: Deserialize<'de> -{ +impl<'de, T> Visitor<'de> for ArrayVisitor<[T; 0]> { type Value = [T; 0]; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -642,9 +640,8 @@ impl<'de, T> Visitor<'de> for ArrayVisitor<[T; 0]> } } -impl<'de, T> Deserialize<'de> for [T; 0] - where T: Deserialize<'de> -{ +// Does not require T: Deserialize<'de>. +impl<'de, T> Deserialize<'de> for [T; 0] { fn deserialize(deserializer: D) -> Result<[T; 0], D::Error> where D: Deserializer<'de> { diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index a9bfaf092..6cfa32a91 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -143,6 +143,16 @@ impl Serialize for PhantomData { /////////////////////////////////////////////////////////////////////////////// +// Does not require T: Serialize. +impl Serialize for [T; 0] { + #[inline] + fn serialize(&self, serializer: S) -> Result + where S: Serializer + { + try!(serializer.serialize_seq_fixed_size(0)).end() + } +} + macro_rules! array_impls { ($len:expr) => { impl Serialize for [T; $len] where T: Serialize { @@ -160,7 +170,6 @@ macro_rules! array_impls { } } -array_impls!(0); array_impls!(1); array_impls!(2); array_impls!(3); diff --git a/test_suite/tests/test_gen.rs b/test_suite/tests/test_gen.rs index 68e63505c..c1e68a92b 100644 --- a/test_suite/tests/test_gen.rs +++ b/test_suite/tests/test_gen.rs @@ -295,6 +295,11 @@ fn test_gen() { #[derive(Serialize, Deserialize)] #[serde(deny_unknown_fields)] struct UnitDenyUnknown; + + #[derive(Serialize, Deserialize)] + struct EmptyArray { + empty: [X; 0], + } } //////////////////////////////////////////////////////////////////////////