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],
+ }
}
//////////////////////////////////////////////////////////////////////////