in src/serialize/per_type/dataclass.rs [87:128]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let len = ffi!(Py_SIZE(self.ptr)) as usize;
if unlikely!(len == 0) {
return ZeroDictSerializer::new().serialize(serializer);
}
let mut map = serializer.serialize_map(None).unwrap();
let mut pos = 0;
let mut next_key: *mut pyo3_ffi::PyObject = core::ptr::null_mut();
let mut next_value: *mut pyo3_ffi::PyObject = core::ptr::null_mut();
pydict_next!(self.ptr, &mut pos, &mut next_key, &mut next_value);
for _ in 0..ffi!(Py_SIZE(self.ptr)) as usize {
let key = next_key;
let value = next_value;
pydict_next!(self.ptr, &mut pos, &mut next_key, &mut next_value);
let key_as_str = {
let key_ob_type = ob_type!(key);
if unlikely!(!is_class_by_type!(key_ob_type, STR_TYPE)) {
err!(SerializeError::KeyMustBeStr)
}
let tmp = unicode_to_str(key);
if unlikely!(tmp.is_none()) {
err!(SerializeError::InvalidStr)
};
tmp.unwrap()
};
if unlikely!(key_as_str.as_bytes()[0] == b'_') {
continue;
}
let pyvalue = PyObjectSerializer::new(value, self.state, self.default);
map.serialize_key(key_as_str).unwrap();
map.serialize_value(&pyvalue)?;
}
map.end()
}