我注意到,由 cloudpickle.dump(obj) 生成的 pickle 文件会有所不同,具体取决于 obj 的类(称为 SubClass,BaseClass 的子类)是否在与 cloudpickling 发生的模块相同的模块中导入或定义。
特别是,如果导入 BaseClass 和 SubClass,则 pickle 文件仅存储对 MyClass 模块和类的引用,这是通过反汇编字节码确定的。
如果 BaseClass 和 SubClass 定义在与 cloudpickling 发生的同一模块中,则 pickle 文件似乎存储 BaseClass 和 SubClass 的代码。
有谁知道为什么会发生这种情况?这是因为当对象在主模块中定义时,cloudpickle 会完全序列化对象及其类吗?
BaseClass 和 SubClass 定义在与 cloudpickling 发生相同的模块中:
import cloudpickle
import pickletools
class BaseClass:
def func(self):
print("BaseClass")
class SubClass(BaseClass):
def subfunc(self):
print("SubClass")
obj = SubClass()
with open("cloudpickle_object.pkl", "wb") as f:
cloudpickle.dump(obj, f)
with open("cloudpickle_object.pkl", "rb") as infile:
pickletools.dis(infile)
Run Code Online (Sandbox Code Playgroud)
反汇编器的输出显示 pickle 文件中的 BaseClass 和 SubClass 代码:
83: \x8c SHORT_BINUNICODE …
Run Code Online (Sandbox Code Playgroud)