diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 17cd872b..4be35fc3 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -226,7 +226,7 @@ array_impls!(32); #[cfg(feature = "unstable")] impl<'a, I> Serialize for Iterator - where I: iter::Iterator, ::Item: Serialize + where I: IntoIterator, ::Item: Serialize { #[inline] fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> @@ -234,7 +234,7 @@ impl<'a, I> Serialize for Iterator { // FIXME: use specialization to prevent invalidating the object in case of clonable iterators? let iter = match self.0.borrow_mut().take() { - Some(iter) => iter, + Some(iter) => iter.into_iter(), None => return Err(S::Error::custom("Iterator used twice")), }; let size = match iter.size_hint() { diff --git a/serde/src/ser/mod.rs b/serde/src/ser/mod.rs index 942ad984..cacaa6dd 100644 --- a/serde/src/ser/mod.rs +++ b/serde/src/ser/mod.rs @@ -22,8 +22,6 @@ use collections::String; use core::marker::PhantomData; #[cfg(feature = "unstable")] use core::cell::RefCell; -#[cfg(feature = "unstable")] -use core::iter; pub mod impls; @@ -424,15 +422,15 @@ pub trait Serializer { /// every time you want to serialize an iterator. #[cfg(feature = "unstable")] pub struct Iterator(RefCell>) - where ::Item: Serialize, - I: iter::Iterator; + where ::Item: Serialize, + I: IntoIterator; /// Creates a temporary type that can be passed to any function expecting a `Serialize` and will /// serialize the given iterator as a sequence #[cfg(feature = "unstable")] pub fn iterator(iter: I) -> Iterator - where ::Item: Serialize, - I: iter::Iterator + where ::Item: Serialize, + I: IntoIterator { Iterator(RefCell::new(Some(iter))) }