带pickle的模块化序列化(Python)

带pickle的模块化序列化(Python),python,pickle,Python,Pickle,我想以模块化的方式对一些对象图进行序列化。也就是说,我不想序列化整个图。原因是这个图表很大。我可以保留图中某个部分的时间戳版本,我可以做一些延迟访问来延迟加载我现在不需要的部分 我想我可以用Python的元编程来处理这个问题。但在Python中,元编程似乎不够强大 这是我现在要做的。我的图形由几个不同的对象组成。其中一些是一个特殊类的实例。此类描述要pickle的根对象。这就是模块化的用武之地。每次我腌制某样东西时,它都从其中一个实例开始,而我从不同时腌制其中两个实例。每当有一个对另一个实例的引

我想以模块化的方式对一些对象图进行序列化。也就是说,我不想序列化整个图。原因是这个图表很大。我可以保留图中某个部分的时间戳版本,我可以做一些延迟访问来延迟加载我现在不需要的部分

我想我可以用Python的元编程来处理这个问题。但在Python中,元编程似乎不够强大

这是我现在要做的。我的图形由几个不同的对象组成。其中一些是一个特殊类的实例。此类描述要pickle的根对象。这就是模块化的用武之地。每次我腌制某样东西时,它都从其中一个实例开始,而我从不同时腌制其中两个实例。每当有一个对另一个实例的引用(可由根对象访问)时,我就用一个持久性的_id替换这个引用,从而确保不会在同一个pickling流中有两个实例。问题出现在取消勾选流时。我可以找到一个尚未加载的实例的persistant_id。在这种情况下,我必须等待加载目标实例,然后才能允许访问它。我看无论如何也不可能做到这一点:

1/我尝试构建一个访问器,get方法返回引用的目标。不幸的是,访问器必须放在类声明中,我不能将它们分配给未勾选的对象。 2/我可以将参考文件存放在需要解析的地方。我认为这在Python中是不可能的:不能保留对位置(字段或变量)的引用,只能保留对值的引用

我的问题可能不清楚。我仍然在寻找一个清晰的公式。我尝试了其他方法,比如使用显式引用,这将是某个“引用”类的实例。不过这不是很方便


你知道如何用pickle实现模块化序列化吗?我是否必须更改Unpickler的内部行为才能记住需要加载对象图其余部分的位置?还有其他更适合实现类似结果的库吗?

我想我会这样做

  • 有一个模块级字典,将持久性_id映射到SpecialClass对象。每次初始化或取消勾选
    SpecialClass
    实例时,请确保已将其添加到字典中

  • 重写SpecialClass的
    \uuuu getattr\uuuuuuuuu
    \uuuuuu setattr\uuuuuuuuuu
    方法,以便
    specialLobj.foo=anotherspecialLobj
    仅在specialLobj上的字典中存储一个持久的\u id(我们称之为
    specialLobj.specialrefs
    )。检索
    speciallobj.foo
    时,它会在specialrefs中查找名称,然后在模块级字典中查找引用

  • 具有模块级的
    check\u graph
    功能,该功能将遍历已知的
    SpecialClass
    实例,并检查其所有specialref是否可用

  • 元编程在Python中很强大;Python类具有极强的可塑性。您可以在声明之后以您想要的方式修改它们,尽管最好在元类(decorator)中完成。更重要的是,实例是可延展的,独立于它们的类

    “对一个地方的引用”通常只是一个字符串。例如,对对象字段的引用是其名称。假设在节点对象中有多个节点引用。您可以使用类似于
    {persistent\u id:(对象,字段名称),…}
    的内容作为未解析的引用表,很容易查找。类似地,在节点列表中,“对位置的引用”是索引


    顺便问一下,你能用键值数据库来存储图形吗?您可以通过ID无需等待即可提取节点。

    问题在于,它要求只有Specialclass实例可以拥有对其他实例的引用。这不是我的情况。例如,对象中不能有实例列表,我不是Python专家。如何检索正在被pickle的字段的名称?为了回答您的问题,在我的例子中,每个“特殊类”实例都有一个唯一的整数id,并且位于由扩展处理的键值数据库中。