The serialization process is built on top of fastavro. To implement a custom serialization logic, you can override the serialize and deserialize methods in a base class that inherits from AvroModel.
Key methods to use within your override:
self.avro_schema_to_python(): To get the schema as a Python dictionary.self.asdict(): To get the instance data as a dictionary.from_dict(...): To convert a dictionary back into a class instance during deserialization.
import dataclasses
import typing
from dataclasses_avroschema import AvroModel, SerializationType
@dataclasses.dataclass
class MyAvroModel(AvroModel):
def serialize(self, serialization_type: SerializationType = "avro") -> bytes:
schema = self.avro_schema_to_python()
data = self.asdict()
# Replace with your custom logic
return custom_serialization(schema, data, serialization_type=serialization_type)
@classmethod
def deserialize(
cls, data: bytes, serialization_type: SerializationType = "avro", create_instance: bool = True
) -> typing.Union[typing.Dict, "AvroModel"]:
schema = cls.avro_schema_to_python()
payload = custom_deserialize(data, schema, serialization_type=serialization_type)
if create_instance:
# Use from_dict to reconstruct the instance
return from_dict(data_class=cls, data=payload)
return payload