Я столкнулся с проблемой при использовании пакета dataclasses-avroschema для сериализации Avro в Python. При попытке сериализации и десериализации класса данных с типом объединения с использованием dataclasses_avroschema десериализованный объект не соответствует ожидаемому типу.
from dataclasses_avroschema import AvroModel
from dataclasses import dataclass
import typing
@dataclass
class MessageTypeTwo(AvroModel):
val: typing.Union[None, str]
class Meta:
namespace = "Messages.type.two"
@dataclass
class MessageTypeOne(AvroModel):
class Meta:
namespace = "Messages.type.one"
@dataclass
class CoreMessage(AvroModel):
messageBody: typing.Union[
MessageTypeOne,
MessageTypeTwo,
]
Сериализуйте и десериализуйте экземпляр CoreMessage с помощью экземпляра MessageTypeTwo:
mt2 = MessageTypeTwo(val = "val")
core_message = CoreMessage(messageBody=mt2)
serialized = core_message.serialize()
deserialized = CoreMessage.deserialize(serialized)
print(deserialized.messageBody)
Ожидаемый результат: оператор печати должен вывести MessageTypeTwo(val='val').
Фактический результат: оператор печати выводит MessageTypeOne().






Чтобы устранить несоответствие при десериализации с пакетом dataclasses-avroschema, я использую атрибут dacite_config внутри мета-класса. Установив "strict": True:
@dataclass
class CoreMessage(AvroModel):
messageBody: typing.Union[
MessageTypeOne,
MessageTypeTwo,
]
class Meta:
dacite_config = {
"strict": True,
}
Для получения более подробной информации проверьте конфигурацию dacite