in python/pyfury/_serializer.py [0:0]
def read(self, buffer):
fury = self.fury
ref_resolver = self.ref_resolver
class_resolver = self.class_resolver
size = buffer.read_varuint32()
map_ = {}
ref_resolver.reference(map_)
chunk_header = 0
if size != 0:
chunk_header = buffer.read_uint8()
key_serializer, value_serializer = self.key_serializer, self.value_serializer
deserialize_ref = (
fury.deserialize_ref if self.fury.is_py else fury.xdeserialize_ref
)
while size > 0:
while True:
key_has_null = (chunk_header & KEY_HAS_NULL) != 0
value_has_null = (chunk_header & VALUE_HAS_NULL) != 0
if not key_has_null:
if not value_has_null:
break
else:
track_key_ref = (chunk_header & TRACKING_KEY_REF) != 0
if (chunk_header & KEY_DECL_TYPE) != 0:
if track_key_ref:
ref_id = ref_resolver.try_preserve_ref_id(buffer)
if ref_id < NOT_NULL_VALUE_FLAG:
key = ref_resolver.get_read_object()
else:
key = self._read_obj(key_serializer, buffer)
ref_resolver.set_read_object(ref_id, key)
else:
key = self._read_obj(key_serializer, buffer)
else:
key = deserialize_ref(buffer)
map_[key] = None
else:
if not value_has_null:
track_value_ref = (chunk_header & TRACKING_VALUE_REF) != 0
if (chunk_header & VALUE_DECL_TYPE) != 0:
if track_value_ref:
ref_id = ref_resolver.try_preserve_ref_id(buffer)
if ref_id < NOT_NULL_VALUE_FLAG:
value = ref_resolver.get_read_object()
else:
value = self._read_obj(value_serializer, buffer)
ref_resolver.set_read_object(ref_id, value)
else:
value = deserialize_ref(buffer)
map_[None] = value
else:
map_[None] = None
size -= 1
if size == 0:
return map_
else:
chunk_header = buffer.read_uint8()
track_key_ref = (chunk_header & TRACKING_KEY_REF) != 0
track_value_ref = (chunk_header & TRACKING_VALUE_REF) != 0
key_is_declared_type = (chunk_header & KEY_DECL_TYPE) != 0
value_is_declared_type = (chunk_header & VALUE_DECL_TYPE) != 0
chunk_size = buffer.read_uint8()
if not key_is_declared_type:
key_serializer = class_resolver.read_typeinfo(buffer).serializer
if not value_is_declared_type:
value_serializer = class_resolver.read_typeinfo(buffer).serializer
for i in range(chunk_size):
if track_key_ref:
ref_id = ref_resolver.try_preserve_ref_id(buffer)
if ref_id < NOT_NULL_VALUE_FLAG:
key = ref_resolver.get_read_object()
else:
key = self._read_obj(key_serializer, buffer)
ref_resolver.set_read_object(ref_id, key)
else:
key = self._read_obj(key_serializer, buffer)
if track_value_ref:
ref_id = ref_resolver.try_preserve_ref_id(buffer)
if ref_id < NOT_NULL_VALUE_FLAG:
value = ref_resolver.get_read_object()
else:
value = self._read_obj(value_serializer, buffer)
ref_resolver.set_read_object(ref_id, value)
else:
value = self._read_obj(value_serializer, buffer)
map_[key] = value
size -= 1
if size != 0:
chunk_header = buffer.read_uint8()
return map_