dataclasses-avroschema联合类型的序列化与反序列化错误

0 投票
1 回答
24 浏览
提问于 2025-04-12 06:41

我在使用 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 配置

撰写回答