【发布时间】:2012-05-15 19:16:42
【问题描述】:
我想以模块化的方式执行一些对象图的序列化。那就是我不想序列化整个图。原因是这张图很大。我可以保留图表某些部分的时间戳版本,并且我可以做一些惰性访问来推迟加载我现在不需要的部分。
我认为我可以通过 Python 中的元编程来解决这个问题。但似乎 Python 中的元编程还不够强大。
这就是我现在要做的。我的图表由几个不同的对象组成。其中一些是特殊类的实例。此类描述要腌制的根对象。这就是模块化的用武之地。每次我腌制一些东西时,它都会从其中一个实例开始,我从不同时腌制其中两个。每当有对另一个实例的引用,根对象可以访问时,我用一个persistant_id 替换这个引用,从而确保我不会在同一个酸洗流中拥有它们中的两个。解封流时出现问题。我可以找到一个尚未加载的实例的persistant_id。在这种情况下,我必须等待目标实例被加载,然后才能访问它。而且我无论如何也看不到这样做:
1/ 我尝试构建一个 get 方法返回引用目标的访问器。不幸的是,访问器必须放在类声明中,我不能将它们分配给未腌制的对象。 2/我可以将引用必须解决的地方存储在某个地方。我认为这在 Python 中是不可能的:不能保留对位置(字段或变量)的引用,只能保留对值的引用。
我的问题可能不清楚。我仍在寻找一个清晰的配方。我尝试了其他方法,例如使用显式引用,这将是某些“引用”类的实例。不过也不是很方便。
你知道如何用 pickle 实现模块化序列化吗?我是否必须更改 Unpickler 的内部行为才能记住我需要加载剩余对象图的位置?是否有其他库更适合实现类似结果?
【问题讨论】: