我在 Python 中使用 dataclasses-avroschema 包进行 Avro 序列化时遇到了问题。当尝试使用 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,
]
使用 MessageTypeTwo 实例序列化和反序列化 CoreMessage 实例:
mt2 = MessageTypeTwo(val="val")
core_message = CoreMessage(messageBody=mt2)
serialized = core_message.serialize()
deserialized = CoreMessage.deserialize(serialized)
print(deserialized.messageBody)
预期结果: print 语句应输出 MessageTypeTwo(val='val')。
实际结果: print 语句输出 MessageTypeOne()。
为了解决与 dataclasses-avroschema 包反序列化时的不匹配问题,我在 Meta 类中使用 dacite_config 属性。通过设置“严格”:True:
@dataclass
class CoreMessage(AvroModel):
messageBody: typing.Union[
MessageTypeOne,
MessageTypeTwo,
]
class Meta:
dacite_config = {
"strict": True,
}
有关更多详细信息,请检查英安岩配置