MCPcopy Create free account
hub / github.com/apache/fory / DataClassSerializer

Class DataClassSerializer

python/pyfory/struct.py:377–777  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

375
376
377class DataClassSerializer(Serializer):
378 _BASIC_SERIALIZERS = (
379 BooleanSerializer,
380 ByteSerializer,
381 Int16Serializer,
382 Int32Serializer,
383 Int64Serializer,
384 Float32Serializer,
385 Float64Serializer,
386 StringSerializer,
387 )
388
389 def __init__(
390 self,
391 type_resolver,
392 clz: type,
393 field_names: List[str] = None,
394 serializers: List[Serializer] = None,
395 nullable_fields: Dict[str, bool] = None,
396 dynamic_fields: Dict[str, bool] = None,
397 ref_fields: Dict[str, bool] = None,
398 field_infos: List[FieldInfo] = None,
399 fields_from_typedef: bool = False,
400 ):
401 super().__init__(type_resolver, clz)
402
403 self._type_hints = get_type_hints(clz)
404 self._has_slots = hasattr(clz, "__slots__")
405
406 self._fields_from_typedef = fields_from_typedef or (field_names is not None and serializers is not None)
407 if field_infos is not None:
408 self._field_infos = list(field_infos)
409 self._field_names = [fi.name for fi in self._field_infos]
410 self._serializers = [fi.serializer for fi in self._field_infos]
411 self._nullable_fields = {fi.name: fi.nullable for fi in self._field_infos}
412 self._ref_fields = {fi.name: fi.runtime_ref_tracking for fi in self._field_infos}
413 self._dynamic_fields = {fi.name: fi.dynamic for fi in self._field_infos}
414 self._field_metas = {}
415 elif self._fields_from_typedef:
416 self._field_names = list(field_names)
417 self._serializers = list(serializers)
418 self._nullable_fields = nullable_fields or {}
419 self._ref_fields = ref_fields or {}
420 self._dynamic_fields = dynamic_fields or {}
421 self._field_infos = []
422 self._field_metas = {}
423 else:
424 self._field_infos, self._field_metas = _extract_field_infos(type_resolver, clz, self._type_hints)
425 if self._field_infos:
426 self._field_names = [fi.name for fi in self._field_infos]
427 self._serializers = [fi.serializer for fi in self._field_infos]
428 self._nullable_fields = {fi.name: fi.nullable for fi in self._field_infos}
429 self._ref_fields = {fi.name: fi.runtime_ref_tracking for fi in self._field_infos}
430 self._dynamic_fields = {fi.name: fi.dynamic for fi in self._field_infos}
431 else:
432 self._field_names = field_names or self._get_field_names(clz)
433 self._nullable_fields = nullable_fields or {}
434 self._ref_fields = {}

Calls

no outgoing calls