python - 遍历对象层次结构pickle样式

标签 python django serialization pickle celery

我需要对在发生之前被 pickle 的对象进行某种处理。更准确地说,对于某个基类的子类的实例,我希望对完全不同的东西进行 pickle ,然后在加载时重新创建。

我知道 __getstate____setstate__ 但这是一种非常侵入性的方法。我的理解是,这些是私有(private)方法(以双下划线开头:__),因此会受到名称修改的影响。因此,这实际上会迫使我为我想要受到这种非标准行为影响的每个类重新定义这两种方法。此外,我并没有真正完全控制所有类的层次结构。

我想知道是否有某种简短的方法可以 Hook pickle 过程并应用 __getstate__ 和 __setstate__ 提供的这种控制,但无需修改像这样的 pickle 类。

为好奇的人提供一个旁注。这是取自使用 Django 和 Celery 的项目的用例。 Django 模型要么不可pickle,要么非常不实用且pickle 很麻烦。因此,更建议 pickle ID + 模型类的值对。然而,有时并不是直接 pickle 模型,而是模型字典、模型列表、模型列表列表等等。这迫使我编写大量我非常不喜欢的复制粘贴代码。对 pickling 模型的需求本身来自 Django-celery 设置,其中函数及其调用参数被安排为稍后执行。不幸的是,在这些争论中,通常有很多模型混合在一些不平凡的层次结构中。

编辑

我确实有可能指定一个由 Celery 使用的自定义序列化器,所以这实际上是一个能够在 pickle 之上构建一个稍微修改过的序列化器而不需要太多努力的问题。

最佳答案

唯一相关的附加 Hook 是 reduce() 和 __reduce__ex()

http://docs.python.org/library/pickle.html

What is the difference between __reduce__ and __reduce_ex__?

Python: Ensuring my class gets pickled only with the latest protocol

不确定他们是否真的提供了您特别需要的东西。

关于python - 遍历对象层次结构pickle样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5878830/

相关文章:

python - 在 pygradle 中使用 PyPi 官方仓库

python - Pandas 查询无值

java - jaxrs 找不到 joda.money 类型的自定义(反)序列化器

python - 有谁知道哪里有序列化数据并在输出中保留其顺序的方法?

python - Flask:获取模块中每个 View 类的 URL

python - 查找用户的 "My Documents"路径

python - 多个 Django 模板加载器

Django 将相同的类属性添加到所有相同类型的字段

python - Django - 来自模板标签内变量的字符串

c# - 为什么 Json.NET 试图反序列化我的 get only 属性?