Skip to content

Commit

Permalink
remove Serialize impl for dyn Array and friends
Browse files Browse the repository at this point in the history
  • Loading branch information
jakobhellermann committed May 17, 2022
1 parent dbd856d commit 481977b
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 63 deletions.
40 changes: 1 addition & 39 deletions crates/bevy_reflect/src/array.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use crate::{serde::Serializable, Reflect, ReflectMut, ReflectRef};
use serde::ser::SerializeSeq;
use std::{
any::Any,
hash::{Hash, Hasher},
Expand Down Expand Up @@ -144,7 +143,7 @@ unsafe impl Reflect for DynamicArray {
}

fn serializable(&self) -> Option<Serializable> {
Some(Serializable::Borrowed(self))
None
}
}

Expand Down Expand Up @@ -210,43 +209,6 @@ impl<'a> Iterator for ArrayIter<'a> {

impl<'a> ExactSizeIterator for ArrayIter<'a> {}

impl serde::Serialize for dyn Array {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
array_serialize(self, serializer)
}
}

impl serde::Serialize for DynamicArray {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
array_serialize(self, serializer)
}
}

/// Serializes the given [array](Array).
#[inline]
pub fn array_serialize<A: Array + ?Sized, S>(array: &A, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut seq = serializer.serialize_seq(Some(array.len()))?;
for element in array.iter() {
let serializable = element.serializable().ok_or_else(|| {
serde::ser::Error::custom(format!(
"Type '{}' does not support `Reflect` serialization",
element.type_name()
))
})?;
seq.serialize_element(serializable.borrow())?;
}
seq.end()
}

/// Returns the `u64` hash of the given [array](Array).
#[inline]
pub fn array_hash<A: Array>(array: &A) -> Option<u64> {
Expand Down
16 changes: 2 additions & 14 deletions crates/bevy_reflect/src/impls/std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ unsafe impl<T: FromReflect> Reflect for Vec<T> {
}

fn serializable(&self) -> Option<Serializable> {
Some(Serializable::Owned(Box::new(SerializeArrayLike(self))))
None
}
}

Expand Down Expand Up @@ -402,7 +402,7 @@ unsafe impl<T: Reflect, const N: usize> Reflect for [T; N] {

#[inline]
fn serializable(&self) -> Option<Serializable> {
Some(Serializable::Owned(Box::new(SerializeArrayLike(self))))
None
}
}

Expand All @@ -420,18 +420,6 @@ impl<T: FromReflect, const N: usize> FromReflect for [T; N] {
}
}

// Supports dynamic serialization for types that implement `Array`.
struct SerializeArrayLike<'a>(&'a dyn Array);

impl<'a> serde::Serialize for SerializeArrayLike<'a> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
crate::array_serialize(self.0, serializer)
}
}

// TODO:
// `FromType::from_type` requires `Deserialize<'de>` to be implemented for `T`.
// Currently serde only supports `Deserialize<'de>` for arrays up to size 32.
Expand Down
11 changes: 1 addition & 10 deletions crates/bevy_reflect/src/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,16 +165,7 @@ unsafe impl Reflect for DynamicList {
}

fn serializable(&self) -> Option<Serializable> {
Some(Serializable::Borrowed(self))
}
}

impl serde::Serialize for DynamicList {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
crate::array_serialize(self, serializer)
None
}
}

Expand Down

0 comments on commit 481977b

Please sign in to comment.