Merge pull request #2148 from serde-rs/deserializecontent
Optimize deserialization of recursive buffered types
This commit is contained in:
commit
1f57084365
@ -1213,6 +1213,20 @@ pub trait Deserializer<'de>: Sized {
|
|||||||
fn is_human_readable(&self) -> bool {
|
fn is_human_readable(&self) -> bool {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Not public API.
|
||||||
|
#[cfg(all(serde_derive, any(feature = "std", feature = "alloc")))]
|
||||||
|
#[doc(hidden)]
|
||||||
|
fn __deserialize_content<V>(
|
||||||
|
self,
|
||||||
|
_: ::actually_private::T,
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<::private::de::Content<'de>, Self::Error>
|
||||||
|
where
|
||||||
|
V: Visitor<'de, Value = ::private::de::Content<'de>>,
|
||||||
|
{
|
||||||
|
self.deserialize_any(visitor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -295,3 +295,8 @@ extern crate serde_derive;
|
|||||||
#[cfg(feature = "serde_derive")]
|
#[cfg(feature = "serde_derive")]
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub use serde_derive::*;
|
pub use serde_derive::*;
|
||||||
|
|
||||||
|
#[cfg(all(serde_derive, any(feature = "std", feature = "alloc")))]
|
||||||
|
mod actually_private {
|
||||||
|
pub struct T;
|
||||||
|
}
|
||||||
|
@ -206,6 +206,7 @@ mod content {
|
|||||||
use lib::*;
|
use lib::*;
|
||||||
|
|
||||||
use __private::size_hint;
|
use __private::size_hint;
|
||||||
|
use actually_private;
|
||||||
use de::{
|
use de::{
|
||||||
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny,
|
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny,
|
||||||
MapAccess, SeqAccess, Unexpected, Visitor,
|
MapAccess, SeqAccess, Unexpected, Visitor,
|
||||||
@ -215,7 +216,7 @@ mod content {
|
|||||||
/// deserializing untagged enums and internally tagged enums.
|
/// deserializing untagged enums and internally tagged enums.
|
||||||
///
|
///
|
||||||
/// Not public API. Use serde-value instead.
|
/// Not public API. Use serde-value instead.
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum Content<'de> {
|
pub enum Content<'de> {
|
||||||
Bool(bool),
|
Bool(bool),
|
||||||
|
|
||||||
@ -294,7 +295,7 @@ mod content {
|
|||||||
// Untagged and internally tagged enums are only supported in
|
// Untagged and internally tagged enums are only supported in
|
||||||
// self-describing formats.
|
// self-describing formats.
|
||||||
let visitor = ContentVisitor { value: PhantomData };
|
let visitor = ContentVisitor { value: PhantomData };
|
||||||
deserializer.deserialize_any(visitor)
|
deserializer.__deserialize_content(actually_private::T, visitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1427,6 +1428,18 @@ mod content {
|
|||||||
drop(self);
|
drop(self);
|
||||||
visitor.visit_unit()
|
visitor.visit_unit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn __deserialize_content<V>(
|
||||||
|
self,
|
||||||
|
_: actually_private::T,
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<Content<'de>, Self::Error>
|
||||||
|
where
|
||||||
|
V: Visitor<'de, Value = Content<'de>>,
|
||||||
|
{
|
||||||
|
let _ = visitor;
|
||||||
|
Ok(self.content)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'de, E> ContentDeserializer<'de, E> {
|
impl<'de, E> ContentDeserializer<'de, E> {
|
||||||
@ -2138,6 +2151,18 @@ mod content {
|
|||||||
{
|
{
|
||||||
visitor.visit_unit()
|
visitor.visit_unit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn __deserialize_content<V>(
|
||||||
|
self,
|
||||||
|
_: actually_private::T,
|
||||||
|
visitor: V,
|
||||||
|
) -> Result<Content<'de>, Self::Error>
|
||||||
|
where
|
||||||
|
V: Visitor<'de, Value = Content<'de>>,
|
||||||
|
{
|
||||||
|
let _ = visitor;
|
||||||
|
Ok(self.content.clone())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> {
|
impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> {
|
||||||
|
Loading…
Reference in New Issue
Block a user