我使用marshmallow-dataclass构建可序列化的类,并将它们嵌套在列表中的另一个类下。
有一个Base数据集,它是一个抽象类,具有实现的大部分功能,还有@abcmethod。从基础上,创建了其他数据类型;将有多个变体,所有这些都是从Base子类中得到的。这些子类能够很好地独立工作。
我打算将所有实例附加到.items下的一个.items数据集中。然后能够将其序列化和反序列化。
以下是我所拥有的一个简化版本:
from abc import ABC, abstractmethod
from typing import List, Tuple
import marshmallow_dataclass
from dataclasses import dataclass
@dataclass
class Base(ABC):
name: str
# _klass: str = None
@marshmallow_dataclass.dataclass
class NameAge(Base):
age: int
@marshmallow_dataclass.dataclass
class NameLocation(Base):
loc: Tuple[float, float]
@marshmallow_dataclass.dataclass
class Store:
items: List[Base]下面是一个打算使用的例子:
a1 = NameAge('John', 33)
a2 = NameLocation('Bob', (50.8, -0.1))
store = Store(items=[a1, a2])
payload = Store.Schema().dump(store)
store_again = Store.Schema().load(payload)
# desired outcome
assert store == store_again问题
Store实例时,Base类架构用于.items。Base被声明为列表中的类型,因此基用于将.Schema()构建为序列化程序。但是,所需的行为是将每个实例序列化其专用类.。
到目前为止我尝试了什么,
success.
_klass用于序列化和跟踪所使用的类,因此可以构建正确的序列化程序。@marshmallow_dataclass.dataclass(base_schema=BaseSchema)),试图拦截@pre_dump和@pre_load,但不使用构造函数Base.__new__拦截大量的Base.__new__来返回正确的模式类,但似乎没有在反序列化阶段调用H 232F 233如有任何建议或帮助,将不胜感激。
发布于 2021-07-05 08:51:46
模式不是继承的:反序列化如何知道一个类的子类?而是使用typing.Union
from abc import ABC, abstractmethod
from typing import List, Tuple, Union
...
@marshmallow_dataclass.dataclass
class Store:
items: List[Union[NameAge, NameLocation]]您需要额外安装union:pip install marchmallow-dataclass[union]
https://stackoverflow.com/questions/65129889
复制相似问题