dataclasses-avroschema联合类型的序列化与反序列化错误
我在使用 dataclasses-avroschema 这个包进行 Python 的 Avro 序列化时遇到了一个问题。当我尝试用 dataclasses_avroschema 来序列化和反序列化一个包含联合类型的 dataclass 时,反序列化出来的对象和我预期的类型不一致。
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()。
1 个回答
0
为了修复使用 dataclasses-avroschema 这个包时出现的反序列化不匹配问题,我在 Meta 类里使用了 dacite_config
属性。通过设置 "strict": True
,可以确保数据的严格匹配。
@dataclass
class CoreMessage(AvroModel):
messageBody: typing.Union[
MessageTypeOne,
MessageTypeTwo,
]
class Meta:
dacite_config = {
"strict": True,
}
想了解更多细节,可以查看 dacite 配置