我必须序列化一个动态创建的类层次结构。和一堆对象 - 后一类的实例。
Python pickle没有太大帮助,它的wiki说“Classes ......不能被腌制”。哦,可能有一些我无法想象的技巧。
表现要求:
反序列化应该非常快,因为序列化的人员用于缓存,并且应该为我节省创建相同类层次结构的工作。
详细说明:
类是使用类型,有时是元类动态创建的。
答案 0 :(得分:0)
如果您提供自定义object.__reduce__()
method,我相信您仍然可以使用酸洗。
通常,在进行酸洗时,会存储类导入路径以及实例状态。在unpickling上,导入类,并使用存储的状态创建新实例。这就是酸洗不能用于动态类的原因,没有什么可以导入的。
object.__reduce__()
方法可让您存储不同的实例工厂。此函数返回的可调用项存储(再次通过导入路径),并使用指定的参数调用以生成实例。然后使用此实例将状态应用于,以与打开常规实例相同的方式:
def class_factory(name):
return globals()[name]()
class SomeDynamicClass(object):
def __reduce__(self):
return (class_factory, (type(self).__name__,), self.__dict__)
这里__reduce__
返回一个函数,函数的参数和实例状态。
然后,您需要为工厂函数提供正确的参数以重新创建类,并返回该类的实例。它将被用于代替直接导入类。
答案 1 :(得分:0)
类是普通的python对象,因此,理论上,如果为它们提供__reduce__
(或实现其他pickle协议方法),则应该是可选择的。尝试在元类上定义__reduce__
。