联合类型与数据类-avroschema 的序列化和反序列化不正确

问题描述 投票:0回答:1

我在 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()。

python avro
1个回答
0
投票

为了解决与 dataclasses-avroschema 包反序列化时的不匹配问题,我在 Meta 类中使用 dacite_config 属性。通过设置“严格”:True:

@dataclass
class CoreMessage(AvroModel):
    messageBody: typing.Union[
        MessageTypeOne,
        MessageTypeTwo,
    ]
    class Meta:
        dacite_config = {
            "strict": True,
        }

有关更多详细信息,请检查英安岩配置

© www.soinside.com 2019 - 2024. All rights reserved.