Python:序列化类层次结构

时间:2013-11-21 11:07:38

标签: python class serialization hierarchy

我必须序列化一个动态创建的类层次结构。和一堆对象 - 后一类的实例。

Python pickle没有太大帮助,它的wiki说“Classes ......不能被腌制”。哦,可能有一些我无法想象的技巧。

表现要求:

反序列化应该非常快,因为序列化的人员用于缓存,并且应该为我节省创建相同类层次结构的工作。

详细说明:

类是使用类型,有时是元类动态创建的。

2 个答案:

答案 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__