pickle.dumps(obj)序列化对象obj的属性,若该对象的类没有__getstate__方法, 则属性内容由__dict__提供,否则由__getstate__提供,使用__getstate__可自定义序列化对象的属性或其他任意内容;
pickle.loads(bytes)反序列化时,会调用__setstate__方法,该方法所需参数为序列化时__dict__或__getstate__提供的,前者提供为字典格式,后者提供格式具体看其返回值。
import pickle
class DemoState:
def __init__(self, name="origin", age=23):
self.name = name
self.age = age
def __str__(self):
return f"name: {self.name}\nage: {self.age}"
# 反序列化时调用, state 是 __getstate__ 的返回对象,
# 若没有__getstate__ 这个方法,则state为该类的__dict__的值(字典格式{field: value})
def __setstate__(self, state):
print("经过 __setstate__")
self.name = state["name"]
self.age = state["age"]
# 序列化时调用
def __getstate__(self):
print("经过__getstate__")
return dict(name="我是getstate", age=31)
if __name__ == '__main__':
demo1 = DemoState()
byte = pickle.dumps(demo1)
print(byte)
string = pickle.loads(byte)
print(string)