带pickle的模块化序列化(Python)
我想以模块化的方式对一些对象图进行序列化。也就是说,我不想序列化整个图。原因是这个图表很大。我可以保留图中某个部分的时间戳版本,我可以做一些延迟访问来延迟加载我现在不需要的部分 我想我可以用Python的元编程来处理这个问题。但在Python中,元编程似乎不够强大 这是我现在要做的。我的图形由几个不同的对象组成。其中一些是一个特殊类的实例。此类描述要pickle的根对象。这就是模块化的用武之地。每次我腌制某样东西时,它都从其中一个实例开始,而我从不同时腌制其中两个实例。每当有一个对另一个实例的引用(可由根对象访问)时,我就用一个持久性的_id替换这个引用,从而确保不会在同一个pickling流中有两个实例。问题出现在取消勾选流时。我可以找到一个尚未加载的实例的persistant_id。在这种情况下,我必须等待加载目标实例,然后才能允许访问它。我看无论如何也不可能做到这一点: 1/我尝试构建一个访问器,get方法返回引用的目标。不幸的是,访问器必须放在类声明中,我不能将它们分配给未勾选的对象。 2/我可以将参考文件存放在需要解析的地方。我认为这在Python中是不可能的:不能保留对位置(字段或变量)的引用,只能保留对值的引用 我的问题可能不清楚。我仍然在寻找一个清晰的公式。我尝试了其他方法,比如使用显式引用,这将是某个“引用”类的实例。不过这不是很方便带pickle的模块化序列化(Python),python,pickle,Python,Pickle,我想以模块化的方式对一些对象图进行序列化。也就是说,我不想序列化整个图。原因是这个图表很大。我可以保留图中某个部分的时间戳版本,我可以做一些延迟访问来延迟加载我现在不需要的部分 我想我可以用Python的元编程来处理这个问题。但在Python中,元编程似乎不够强大 这是我现在要做的。我的图形由几个不同的对象组成。其中一些是一个特殊类的实例。此类描述要pickle的根对象。这就是模块化的用武之地。每次我腌制某样东西时,它都从其中一个实例开始,而我从不同时腌制其中两个实例。每当有一个对另一个实例的引
你知道如何用pickle实现模块化序列化吗?我是否必须更改Unpickler的内部行为才能记住需要加载对象图其余部分的位置?还有其他更适合实现类似结果的库吗?我想我会这样做
SpecialClass
实例时,请确保已将其添加到字典中\uuuu getattr\uuuuuuuuu
和\uuuuuu setattr\uuuuuuuuuu
方法,以便specialLobj.foo=anotherspecialLobj
仅在specialLobj上的字典中存储一个持久的\u id(我们称之为specialLobj.specialrefs
)。检索speciallobj.foo
时,它会在specialrefs中查找名称,然后在模块级字典中查找引用check\u graph
功能,该功能将遍历已知的SpecialClass
实例,并检查其所有specialref是否可用{persistent\u id:(对象,字段名称),…}
的内容作为未解析的引用表,很容易查找。类似地,在节点列表中,“对位置的引用”是索引
顺便问一下,你能用键值数据库来存储图形吗?您可以通过ID无需等待即可提取节点。问题在于,它要求只有Specialclass实例可以拥有对其他实例的引用。这不是我的情况。例如,对象中不能有实例列表,我不是Python专家。如何检索正在被pickle的字段的名称?为了回答您的问题,在我的例子中,每个“特殊类”实例都有一个唯一的整数id,并且位于由扩展处理的键值数据库中。