diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index c30400da..cefe46ef 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -315,6 +315,33 @@ impl Deserialize for Option where T: Deserialize { /////////////////////////////////////////////////////////////////////////////// +/// A visitor that produces a `PhantomData`. +pub struct PhantomDataVisitor { + marker: PhantomData, +} + +impl Visitor for PhantomDataVisitor where T: Deserialize { + type Value = PhantomData; + + #[inline] + fn visit_unit(&mut self) -> Result, E> + where E: Error, + { + Ok(PhantomData) + } +} + +impl Deserialize for PhantomData where T: Deserialize { + fn deserialize(deserializer: &mut D) -> Result, D::Error> + where D: Deserializer, + { + let visitor = PhantomDataVisitor { marker: PhantomData }; + deserializer.deserialize_unit_struct("PhantomData", visitor) + } +} + +/////////////////////////////////////////////////////////////////////////////// + macro_rules! seq_impl { ( $ty:ty, diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index a2441e42..fec942d7 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -23,6 +23,7 @@ use std::ops; use std::path; use std::rc::Rc; use std::sync::Arc; +use std::marker::PhantomData; #[cfg(feature = "nightly")] use core::nonzero::{NonZero, Zeroable}; @@ -121,6 +122,17 @@ impl SeqVisitor for Option where T: Serialize { /////////////////////////////////////////////////////////////////////////////// +impl Serialize for PhantomData { + #[inline] + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + serializer.serialize_unit_struct("PhantomData") + } +} + +/////////////////////////////////////////////////////////////////////////////// + /// A `serde::Visitor` for sequence iterators. /// /// # Examples