diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index d179597b..a6240622 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -762,7 +762,7 @@ impl Deserialize for path::PathBuf { fn deserialize(deserializer: &mut D) -> Result where D: Deserializer, { - deserializer.deserialize(PathBufVisitor) + deserializer.deserialize_string(PathBufVisitor) } } diff --git a/serde/src/de/mod.rs b/serde/src/de/mod.rs index c54726bd..e76ab812 100644 --- a/serde/src/de/mod.rs +++ b/serde/src/de/mod.rs @@ -406,6 +406,16 @@ pub trait Deserializer { self.deserialize_seq(visitor) } + /// This method hints that the `Deserialize` type is expecting some sort of struct key mapping. + /// This allows deserializers to choose between &str, usize, or &[u8] to properly deserialize a + /// struct key. + #[inline] + fn deserialize_struct_key(&mut self, visitor: V) -> Result + where V: Visitor, + { + self.deserialize(visitor) + } + /// Specify a format string for the deserializer. /// /// The deserializer format is used to determine which format diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index f7deccba..eb5aa700 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -949,7 +949,7 @@ fn deserialize_field_visitor( } } - deserializer.deserialize(__FieldVisitor::{ phantom: PhantomData }) + deserializer.deserialize_struct_key(__FieldVisitor::{ phantom: PhantomData }) } } ).unwrap(); diff --git a/serde_tests/tests/test_de.rs b/serde_tests/tests/test_de.rs index 0655a493..181b9517 100644 --- a/serde_tests/tests/test_de.rs +++ b/serde_tests/tests/test_de.rs @@ -1,4 +1,5 @@ use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::path::PathBuf; use num::FromPrimitive; use num::bigint::{BigInt, BigUint}; @@ -593,4 +594,9 @@ declare_tests! { Token::SeqEnd, ], } + test_path_buf { + PathBuf::from("/usr/local/lib") => vec![ + Token::String("/usr/local/lib".to_owned()), + ], + } } diff --git a/serde_tests/tests/test_ser.rs b/serde_tests/tests/test_ser.rs index a5947508..7fbae4e4 100644 --- a/serde_tests/tests/test_ser.rs +++ b/serde_tests/tests/test_ser.rs @@ -1,4 +1,5 @@ use std::collections::BTreeMap; +use std::path::{Path, PathBuf}; use num::FromPrimitive; use num::bigint::{BigInt, BigUint}; @@ -293,4 +294,14 @@ declare_ser_tests! { Token::SeqEnd, ], } + test_path { + Path::new("/usr/local/lib") => &[ + Token::Str("/usr/local/lib"), + ], + } + test_path_buf { + PathBuf::from("/usr/local/lib") => &[ + Token::Str("/usr/local/lib"), + ], + } }