Python pickle对象版本控制
我正在从事一个项目,在这个项目中,我们使用Python pickle对象版本控制,python,serialization,pickle,serialversionuid,Python,Serialization,Pickle,Serialversionuid,我正在从事一个项目,在这个项目中,我们使用pickle/cPickle将大量对象序列化并存储到磁盘 随着项目生命周期的进展(在向该领域的客户发布之后),未来的功能/修复可能需要我们更改一些持久化对象的签名。这可能是添加字段、删除字段,甚至只是更改一段数据上的不变量 是否有一种标准方法来标记将被pickle为具有特定版本的对象(如Java中的serialVersionUID)?基本上,如果我正在恢复一个Foo版本234的实例,但当前代码是236,那么我希望收到一些关于unpickle的通知。我是否
pickle
/cPickle
将大量对象序列化并存储到磁盘
随着项目生命周期的进展(在向该领域的客户发布之后),未来的功能/修复可能需要我们更改一些持久化对象的签名。这可能是添加字段、删除字段,甚至只是更改一段数据上的不变量
是否有一种标准方法来标记将被pickle为具有特定版本的对象(如Java中的serialVersionUID
)?基本上,如果我正在恢复一个Foo版本234的实例,但当前代码是236,那么我希望收到一些关于unpickle的通知。我是否应该继续推出自己的解决方案(可能是PITA)
谢谢pickle格式没有这样的限制条件。为什么不将“序列版本号”作为对象属性的一部分,与其他属性一起进行pickle呢?然后,通过比较实际版本和所需版本,就可以轻松获得“通知”——不明白为什么它应该是PITA。考虑Tomasz Früboes建议的以下类mixin
\uuuu getstate\uuuuu
方法在酸洗时由pickle
调用,而\uuuuu setstate\uuuuu
在取消酸洗时由pickle调用。这个混合类可以用作要跟踪其版本的类的子类。这将按如下方式使用:
# bla.py
from versionable import Versionable
import pickle
class TestVersioning(Versionable):
_class_version = 1
t1 = TestVersioning()
t_pickle_str = pickle.dumps(t1)
class TestVersioning(Versionable):
_class_version = 2
t2 = pickle.loads(t_pickle_str) # Throws exception about wrong class version
是的,这就是我想我们要走的方向。我想我可能高估了添加和检查这些数据所需的工作量。由于我们在一个地方恢复了所有保存的状态,添加了我们需要的任何逻辑(处理未版本化的对象或以前未版本化但现在已版本化的对象应该不会太糟糕)。虽然我会向社区询问pickle是否提供了这种行为,但我正在重新发明轮子。效果很好,谢谢!你的链接(Tomasz Früboes)已断开。我编辑了链接以指向该网站的存档(历史)版本。
# bla.py
from versionable import Versionable
import pickle
class TestVersioning(Versionable):
_class_version = 1
t1 = TestVersioning()
t_pickle_str = pickle.dumps(t1)
class TestVersioning(Versionable):
_class_version = 2
t2 = pickle.loads(t_pickle_str) # Throws exception about wrong class version