@@ -7,6 +7,7 @@ use ahash::AHashMap;
77use serde:: ser:: SerializeMap ;
88use smallvec:: SmallVec ;
99
10+ use crate :: common:: missing_sentinel:: get_missing_sentinel_object;
1011use crate :: serializers:: extra:: SerCheck ;
1112use crate :: PydanticSerializationUnexpectedValue ;
1213
@@ -15,8 +16,7 @@ use super::errors::py_err_se_err;
1516use super :: extra:: Extra ;
1617use super :: filter:: SchemaFilter ;
1718use super :: infer:: { infer_json_key, infer_serialize, infer_to_python, SerializeInfer } ;
18- use super :: shared:: PydanticSerializer ;
19- use super :: shared:: { CombinedSerializer , TypeSerializer } ;
19+ use super :: shared:: { CombinedSerializer , PydanticSerializer , TypeSerializer } ;
2020
2121/// representation of a field for serialization
2222#[ derive( Debug ) ]
@@ -169,6 +169,7 @@ impl GeneralFieldsSerializer {
169169 ) -> PyResult < Bound < ' py , PyDict > > {
170170 let output_dict = PyDict :: new ( py) ;
171171 let mut used_req_fields: usize = 0 ;
172+ let missing_sentinel = get_missing_sentinel_object ( py) ;
172173
173174 // NOTE! we maintain the order of the input dict assuming that's right
174175 for result in main_iter {
@@ -178,6 +179,10 @@ impl GeneralFieldsSerializer {
178179 if extra. exclude_none && value. is_none ( ) {
179180 continue ;
180181 }
182+ if value. is ( missing_sentinel) {
183+ continue ;
184+ }
185+
181186 let field_extra = Extra {
182187 field_name : Some ( key_str) ,
183188 ..extra
@@ -253,9 +258,13 @@ impl GeneralFieldsSerializer {
253258
254259 for result in main_iter {
255260 let ( key, value) = result. map_err ( py_err_se_err) ?;
261+ let missing_sentinel = get_missing_sentinel_object ( value. py ( ) ) ;
256262 if extra. exclude_none && value. is_none ( ) {
257263 continue ;
258264 }
265+ if value. is ( missing_sentinel) {
266+ continue ;
267+ }
259268 let key_str = key_str ( & key) . map_err ( py_err_se_err) ?;
260269 let field_extra = Extra {
261270 field_name : Some ( key_str) ,
@@ -347,6 +356,7 @@ impl TypeSerializer for GeneralFieldsSerializer {
347356 extra : & Extra ,
348357 ) -> PyResult < PyObject > {
349358 let py = value. py ( ) ;
359+ let missing_sentinel = get_missing_sentinel_object ( py) ;
350360 // If there is already a model registered (from a dataclass, BaseModel)
351361 // then do not touch it
352362 // If there is no model, we (a TypedDict) are the model
@@ -368,6 +378,9 @@ impl TypeSerializer for GeneralFieldsSerializer {
368378 if extra. exclude_none && value. is_none ( ) {
369379 continue ;
370380 }
381+ if value. is ( missing_sentinel) {
382+ continue ;
383+ }
371384 if let Some ( ( next_include, next_exclude) ) = self . filter . key_filter ( & key, include, exclude) ? {
372385 let value = match & self . extra_serializer {
373386 Some ( serializer) => {
@@ -401,7 +414,7 @@ impl TypeSerializer for GeneralFieldsSerializer {
401414 extra. warnings . on_fallback_ser :: < S > ( self . get_name ( ) , value, extra) ?;
402415 return infer_serialize ( value, serializer, include, exclude, extra) ;
403416 } ;
404-
417+ let missing_sentinel = get_missing_sentinel_object ( value . py ( ) ) ;
405418 // If there is already a model registered (from a dataclass, BaseModel)
406419 // then do not touch it
407420 // If there is no model, we (a TypedDict) are the model
@@ -428,6 +441,9 @@ impl TypeSerializer for GeneralFieldsSerializer {
428441 if extra. exclude_none && value. is_none ( ) {
429442 continue ;
430443 }
444+ if value. is ( missing_sentinel) {
445+ continue ;
446+ }
431447 let filter = self . filter . key_filter ( & key, include, exclude) . map_err ( py_err_se_err) ?;
432448 if let Some ( ( next_include, next_exclude) ) = filter {
433449 let output_key = infer_json_key ( & key, extra) . map_err ( py_err_se_err) ?;
0 commit comments