in python/pyfury/_serializer.py [0:0]
def write_header(self, buffer, value):
collect_flag = COLLECTION_DEFAULT_FLAG
elem_type = self.elem_type
elem_typeinfo = self.elem_typeinfo
has_null = False
has_different_type = False
if elem_type is None:
collect_flag |= COLLECTION_NOT_DECL_ELEMENT_TYPE
for s in value:
if not has_null and s is None:
has_null = True
continue
if elem_type is None:
elem_type = type(s)
elif not has_different_type and type(s) is not elem_type:
collect_flag |= COLLECTION_NOT_SAME_TYPE
has_different_type = True
if not has_different_type and elem_type is not None:
elem_typeinfo = self.class_resolver.get_classinfo(elem_type)
else:
for s in value:
if s is None:
has_null = True
break
if has_null:
collect_flag |= COLLECTION_HAS_NULL
if self.fury.ref_tracking:
if self.elem_tracking_ref == 1:
collect_flag |= COLLECTION_TRACKING_REF
elif self.elem_tracking_ref == -1:
if has_different_type or elem_typeinfo.serializer.need_to_write_ref:
collect_flag |= COLLECTION_TRACKING_REF
buffer.write_varuint32(len(value))
buffer.write_int8(collect_flag)
if (
not has_different_type
and (collect_flag & COLLECTION_NOT_DECL_ELEMENT_TYPE) != 0
):
self.class_resolver.write_typeinfo(buffer, elem_typeinfo)
return collect_flag, elem_typeinfo