chaokunyang commented on code in PR #2037: URL: https://github.com/apache/fury/pull/2037#discussion_r1944244102
########## python/pyfury/_serializer.py: ########## @@ -294,39 +298,219 @@ def __init__(self, fury, type_, key_serializer=None, value_serializer=None): self.key_serializer = key_serializer self.value_serializer = value_serializer - def write(self, buffer, value: Dict): - buffer.write_varuint32(len(value)) - for k, v in value.items(): - key_cls = type(k) - if key_cls is str: - buffer.write_int16(NOT_NULL_STRING_FLAG) - buffer.write_string(k) + def write(self, buffer, o): + obj = o + length = len(obj) + buffer.write_varuint32(length) + if length == 0: + return + fury = self.fury + class_resolver = fury.class_resolver + ref_resolver = fury.ref_resolver + key_serializer = self.key_serializer + value_serializer = self.value_serializer + pos = 0 + items = list(obj.items()) + while pos < len(items): + key, value = items[pos] + pos += 1 + if key is not None: + if value is not None: + break + if key_serializer is not None: + if key_serializer.need_to_write_ref: + buffer.write_int8(NULL_VALUE_KEY_DECL_TYPE_TRACKING_REF) + if not self.ref_resolver.write_ref_or_null(buffer, key): + key_serializer.write(buffer, key) + else: + buffer.write_int8(NULL_VALUE_KEY_DECL_TYPE) + key_serializer.write(buffer, key) + else: + buffer.write_int8(VALUE_HAS_NULL | TRACKING_KEY_REF) + fury.serialize_ref(buffer, key) else: - if not self.ref_resolver.write_ref_or_null(buffer, k): - classinfo = self.class_resolver.get_classinfo(key_cls) - self.class_resolver.write_typeinfo(buffer, classinfo) - classinfo.serializer.write(buffer, k) - value_cls = type(v) - if value_cls is str: - buffer.write_int16(NOT_NULL_STRING_FLAG) - buffer.write_string(v) - elif value_cls is int: - buffer.write_int16(NOT_NULL_INT64_FLAG) - buffer.write_varint64(v) + if value is not None: + if value_serializer is not None: + if value_serializer.need_to_write_ref: + buffer.write_int8(NULL_KEY_VALUE_DECL_TYPE_TRACKING_REF) + if not self.ref_resolver.write_ref_or_null(buffer, key): + value_serializer.write(buffer, key) + if not self.ref_resolver.write_ref_or_null(buffer, value): + value_serializer.write(buffer, value) + else: + buffer.write_int8(NULL_KEY_VALUE_DECL_TYPE) + value_serializer.write(buffer, value) + else: + buffer.write_int8(KEY_HAS_NULL | TRACKING_VALUE_REF) + fury.serialize_ref(buffer, value) + else: + buffer.write_int8(KV_NULL) + if pos >= len(items): + break + key_cls = type(key) + value_cls = type(value) + buffer.write_int16(-1) + chunk_size_offset = buffer.writer_index - 1 + chunk_header = 0 + if key_serializer is not None: + chunk_header |= KEY_DECL_TYPE else: - if not self.ref_resolver.write_ref_or_null(buffer, v): - classinfo = self.class_resolver.get_classinfo(value_cls) - self.class_resolver.write_typeinfo(buffer, classinfo) - classinfo.serializer.write(buffer, v) + key_classinfo = self.class_resolver.get_classinfo(key_cls) + class_resolver.write_typeinfo(buffer, key_classinfo) + key_serializer = key_classinfo.serializer + if value_serializer is not None: + chunk_header |= VALUE_DECL_TYPE + else: + value_classinfo = self.class_resolver.get_classinfo(value_cls) + class_resolver.write_typeinfo(buffer, value_classinfo) + value_serializer = value_classinfo.serializer + key_write_ref = key_serializer.need_to_write_ref + value_write_ref = value_serializer.need_to_write_ref + if key_write_ref: + chunk_header |= TRACKING_KEY_REF + if value_write_ref: + chunk_header |= TRACKING_VALUE_REF + buffer.put_int8(chunk_size_offset - 1, chunk_header) + key_serializer_type = type(key_serializer) + value_serializer_type = type(value_serializer) + chunk_size = 0 + while True: + if (key is None or value is None or + type(key) is not key_cls or type(value) is not value_cls): + break + if not key_write_ref or not ref_resolver.write_ref_or_null(buffer, key): + if key_cls is str: Review Comment: Users will use cython mode only, python mode is used only when there are some deserialization error which needs debug line by line -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@fury.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@fury.apache.org For additional commands, e-mail: commits-h...@fury.apache.org