@@ -65,39 +65,40 @@ impl<'de> de::MapAccess<'de> for MapAccess {
65
65
66
66
struct ObjectAccess {
67
67
obj : ObjectExt ,
68
- fields : std:: slice:: Iter < ' static , & ' static str > ,
68
+ fields : std:: iter :: Enumerate < std :: slice:: Iter < ' static , & ' static str > > ,
69
69
next_value : Option < Deserializer > ,
70
70
}
71
71
72
72
impl ObjectAccess {
73
73
fn new ( obj : ObjectExt , fields : & ' static [ & ' static str ] ) -> Self {
74
74
Self {
75
75
obj,
76
- fields : fields. iter ( ) ,
76
+ fields : fields. iter ( ) . enumerate ( ) ,
77
77
next_value : None ,
78
78
}
79
79
}
80
80
}
81
81
82
- fn str_deserializer ( s : & str ) -> de:: value:: StrDeserializer < Error > {
83
- de:: IntoDeserializer :: into_deserializer ( s)
84
- }
85
-
86
82
impl < ' de > de:: MapAccess < ' de > for ObjectAccess {
87
83
type Error = Error ;
88
84
89
85
fn next_key_seed < K : de:: DeserializeSeed < ' de > > ( & mut self , seed : K ) -> Result < Option < K :: Value > > {
90
86
debug_assert ! ( self . next_value. is_none( ) ) ;
91
87
92
- for field in & mut self . fields {
88
+ for ( i , & field) in & mut self . fields {
93
89
let js_field = static_str_to_js ( field) ;
94
90
let next_value = self . obj . get_with_ref_key ( & js_field) ;
95
91
// If this value is `undefined`, it might be actually a missing field;
96
92
// double-check with an `in` operator if so.
97
93
let is_missing_field = next_value. is_undefined ( ) && !js_field. js_in ( & self . obj ) ;
98
94
if !is_missing_field {
99
95
self . next_value = Some ( Deserializer :: from ( next_value) ) ;
100
- return Ok ( Some ( seed. deserialize ( str_deserializer ( field) ) ?) ) ;
96
+ // Serde can deserialize struct fields from their indices.
97
+ // Using them allows for more efficient deserialization as it
98
+ // avoids string comparisons.
99
+ return Ok ( Some ( seed. deserialize (
100
+ de:: IntoDeserializer :: < Error > :: into_deserializer ( i) ,
101
+ ) ?) ) ;
101
102
}
102
103
}
103
104
@@ -127,8 +128,10 @@ impl<'de> de::SeqAccess<'de> for PreservedValueAccess {
127
128
match this {
128
129
Self :: OnMagic ( value) => {
129
130
* self = Self :: OnValue ( value) ;
130
- seed. deserialize ( str_deserializer ( PRESERVED_VALUE_MAGIC ) )
131
- . map ( Some )
131
+ seed. deserialize ( de:: IntoDeserializer :: into_deserializer (
132
+ PRESERVED_VALUE_MAGIC ,
133
+ ) )
134
+ . map ( Some )
132
135
}
133
136
Self :: OnValue ( value) => seed
134
137
. deserialize ( Deserializer {
0 commit comments