将序列化对象存储在数据库中,然后从密钥恢复对象状态

时间:2011-07-06 13:02:27

标签: python python-3.x

好的,这很有趣。

代码将说明我正在考虑的最佳内容:

class Restorable(object):
    def __init__(self, a=1, b=1):
        self.a = a
        self.b = b

    def restore(self, serialized_object):
        # I'm aware this is local, just illustrating
        self = pickle.loads(serialized_object)

r = Restorable()
r.a = 1000
r.b = 2000
saved_state = pickle.dumps(r)
r.a = -1
r.b = -1
r.restore(pickle.dumps(saved_state)
# r.a should again be 1000
# r.b should again be 2000

这个想法是:可以说,pickle.dumps()一个对象,将它存储在某个地方,修改真实对象,然后通过我安全存储的内容将其恢复到以前的状态?

我已经尝试了上面显示的代码,暂时self设置为之前的状态,但仅限于本地 - 嗯,这里并不奇怪。

这是一个好奇心问题。

编辑:以明确的方式提出问题:

是否可以使用相同类型的序列化对象编写一个可以恢复其状态的对象?

实际上,我看到这可以通过在restore()中创建序列化对象的实例并逐个复制值来完成。但对于大型物体来说这可能是乏味的。

1 个答案:

答案 0 :(得分:3)

正如您在编辑中所说,创建一个新对象(显然不要分配给self),但不是逐个复制属性,而是

def restore(self, serialized_object):
    original = pickle.loads(serialized_object)
    self.__dict__.update(original.__dict__)

并立即更新所有属性。这是您的完整(重新设计)示例:

import pickle
class Restorable(object):
    def __init__(self, a=1, b=1):
        self.a = a
        self.b = b
    def restore(self, serialized_object):
        original = pickle.loads(serialized_object)
        self.__dict__.update(original.__dict__)

r = Restorable()
r.a = 1000
r.b = 2000
saved_state = pickle.dumps(r)
r.a = -1
r.b = -1
r.restore(saved_state)
print r.a, r.b