chaokunyang commented on code in PR #2037:
URL: https://github.com/apache/fury/pull/2037#discussion_r1944220875
##########
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:
The pure python implementation is used for debug only, we can remove all
fastpath, just keep the most simple implementation
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]