来自导入类的对象的 cloudpickle 与在发生酸洗的同一模块中定义的类

如何解决来自导入类的对象的 cloudpickle 与在发生酸洗的同一模块中定义的类

我注意到由 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)

反汇编器的输出显示了pickle文件中的BaseClass和SubClass代码

   83: \x8c     SHORT_BINUNICODE 'SubClass'
   93: \x94     MEMOIZE    (as 6)
   94: h        BINGET     2
   96: (        MARK
   97: h            BINGET     5
   99: \x8c         SHORT_BINUNICODE 'BaseClass'
  110: \x94         MEMOIZE    (as 7)
  111: h            BINGET     3
  113: \x8c         SHORT_BINUNICODE 'object

从不同的模块导入的 BaseClass 和 SubClass 作为 cloudpickling 发生的地方:

import cloudpickle
import pickletools
from myclass import SubClass


obj = SubClass()
with open("cloudpickle_object.pkl","rb") as infile:
    pickletools.dis(infile)

仅引用 SubClass 的输出,没有 BaseClass 或代码

    0: \x80 PROTO      4
    2: \x95 FRAME      27
   11: \x8c SHORT_BINUNICODE 'myclass'
   20: \x94 MEMOIZE    (as 0)
   21: \x8c SHORT_BINUNICODE 'SubClass'
   [...]

解决方法

cloudpickle 仅序列化属于 __main__ 模块一部分的对象,如其 github https://github.com/cloudpipe/cloudpickle 所述。

因此,使用导入的 pickle 对象更小是很自然的,因为这些对象在 unpickling 时会被导入。

有趣的是,有一些功能请求和一些工作已经完成,使 cloudpickle 序列化一些导入的模块。例如,

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?