| 650 | |
| 651 | |
| 652 | class ForyArrayFieldSerializer(Serializer): |
| 653 | def __init__(self, type_resolver, wrapper_type, type_id, field_name=None): |
| 654 | super().__init__(type_resolver, wrapper_type) |
| 655 | self.wrapper_type = wrapper_type |
| 656 | self.type_id = type_id |
| 657 | self.field_name = field_name or "<array>" |
| 658 | wrapper_serializer_type = fory_array_serializer_type(type_id) |
| 659 | self.wrapper_serializer = wrapper_serializer_type(type_resolver, wrapper_type) |
| 660 | self.list_adapter_serializer = ForyArrayListAdapterSerializer( |
| 661 | type_resolver, |
| 662 | wrapper_type, |
| 663 | self.wrapper_serializer, |
| 664 | self.field_name, |
| 665 | ) |
| 666 | self.pyarray_serializer = self._build_pyarray_serializer(type_resolver, type_id) |
| 667 | self.ndarray_serializer = self._build_ndarray_serializer(type_resolver, type_id) |
| 668 | self.need_to_write_ref = False |
| 669 | |
| 670 | def _build_pyarray_serializer(self, type_resolver, type_id): |
| 671 | typecode = typeid_code.get(type_id) |
| 672 | if typecode is None: |
| 673 | return None |
| 674 | _itemsize, ftype, _type_id = typecode_dict[typecode] |
| 675 | return PyArraySerializer(type_resolver, ftype, type_id) |
| 676 | |
| 677 | def _build_ndarray_serializer(self, type_resolver, type_id): |
| 678 | if np is None: |
| 679 | return None |
| 680 | for dtype, ( |
| 681 | _itemsize, |
| 682 | _format, |
| 683 | ftype, |
| 684 | dtype_type_id, |
| 685 | ) in Numpy1DArraySerializer.dtypes_dict.items(): |
| 686 | if dtype_type_id == type_id: |
| 687 | return Numpy1DArraySerializer(type_resolver, ftype, dtype) |
| 688 | return None |
| 689 | |
| 690 | def write(self, buffer, value): |
| 691 | value_type = type(value) |
| 692 | if value_type is self.wrapper_type: |
| 693 | self.wrapper_serializer.write(buffer, value) |
| 694 | return |
| 695 | if value_type is list: |
| 696 | self.list_adapter_serializer.write(buffer, value) |
| 697 | return |
| 698 | if value_type is array.array: |
| 699 | if self.pyarray_serializer is None: |
| 700 | raise TypeError(f"pyfory.Array field {self.field_name!r} does not support array.array for this element type") |
| 701 | actual_type_id = self.pyarray_serializer._array_type_id(value) |
| 702 | if actual_type_id != self.type_id: |
| 703 | raise TypeError( |
| 704 | f"pyfory.Array field {self.field_name!r} requires array.array typecode for type id {self.type_id}, got {value.typecode!r}" |
| 705 | ) |
| 706 | self.pyarray_serializer.write(buffer, value) |
| 707 | return |
| 708 | if np is not None and value_type is np.ndarray: |
| 709 | if self.ndarray_serializer is None: |
no outgoing calls
no test coverage detected