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

Reply via email to