【发布时间】:2021-10-16 10:11:14
【问题描述】:
我想腌制一个对象以便能够存储/恢复我的会话。 该对象包含对其他对象的多个引用。
我知道引用的对象会被它腌制,但是在取消腌制时引用会发生变化。我也知道将对象腌制在一起可以维护引用,尽管这对我来说很复杂,因为我需要腌制整个复杂的对象结构。
示例
p1 = Point()
p2 = Point()
p1.nearest_point = p2
p2.nearest_point = p1
line = Line(p1, Point())
with open("pickled", "wb") as file:
pickler = pickle.Pickler(file)
pickler.dump(p1)
pickler.dump(p2)
with open("pickled", "rb") as file:
pickler = pickle.Unpickler(file)
p1 = pickler.load()
p2 = pickler.load()
# True: Reference between the two pickled objects is maintained
assert p1.nearest_point == p2
# False: Reference between not-pickled and pickled objects is broken, leading to a duplicate object (original, unpickled)
assert line.pointA == p1
在这种情况下,解决方案也可能是对 Line 对象进行腌制,但在我的实际情况中,我正在处理一个更复杂的结构,其中对结构的每个部分进行腌制/取消腌制肯定会导致疏忽和错误。
我该如何正确处理这个问题?
【问题讨论】:
-
把你想腌制的所有东西都放在一个列表中,然后腌制这个列表。