- 使用方法
# 自定义对象序列化的时候使用
class Demo:
    def __init__(self, name, age=0):
        self.name = name
        self.age = age
    def __str__(self):
        return f"name: {self.name}\nage: {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))