- 使用方法
# 自定义对象序列化的时候使用
class Demo:
def __init__(self, name, age=0):
self.name = name
self.age = age
def __str__(self):
return f"name: {self.name}
age: {self.age}"
class DemoState1(Demo):
# 反序列化时调用, state 是 __getstate__ 的返回对象,不定义__getstate__ 返回 {'name': 'None', 'age': 0},当前对象的属性
def __setstate__(self, state):
print("invoke __setstate__")
# 将记录的信息("Python3") 赋给 name
self.name = state
self.age = 31
# 序列化时调用
# 定义后:返回 name: Python3
# 不定义:name: {'name': 'None', 'age': 0}
def __getstate__(self):
print("invoke __getstate__")
# 记录信息 “Python3”
return "Python3"
import pickle
demo_1 = DemoState1("None") # "None" 0
print(demo_1)
demo_bytes_1 = pickle.dumps(demo_1) # 序列化为字节串, __getstate__
print(demo_bytes_1) # 仅对象中的字符串信息是可读的
demo_object_1 = pickle.loads(demo_bytes_1) # 反序列化, __setstate__
print(demo_object_1)
# 如果 __getstate__ 与 __setstate__ 都省略, 那么就是默认情况, 自动保存和加载对象的属性字典 __dict__
# js = Demo("JavaScript", 26)
# print(js.__dict__) # 对象的属性字典
# js_bytes = pickle.dumps(js)
# print(pickle.loads(js_bytes))