Wang's blog

基础 - 序列化

Published on

在Qlib中,类qlib.utils.serial.Serializable是所有可序列化类(包括DataHandlerDataSetProcessorModel等)的基类。

该类提供了以下方法进行序列化/反序列化:

  • config:设置哪些属性需要/不需要序列化
  • to_pickle:将对象序列化为文件
  • load:类方法,将文件反序列化为对象
  • general_dump:类方法,序列化任意对象。对于本类对象,调用其to_pickle方法;对于非本类对象,直接使用pickle进行序列化

该类使用以下机制灵活地控制每个属性是否需要序列化:

  • _is_kept方法:判断一个属性是否需要序列化。规则如下(按优先级排序):
    • 如果属性在self.config_attr中,不需要序列化
    • 如果属性在self._get_attr_list(“include”)中,需要序列化
    • 如果属性在self._get_attr_list(“exclude”)中,不需要序列化
    • 如果self.dump_all为真,需要序列化
    • 如果属性以下划线开头,不需要序列化
  • config_attr字段:永远不会序列化此列表中的属性。默认为["_include", “_exclude”]
  • _get_attr_list方法:获取需要序列化与不需要序列化的属性列表
    • _include与include_attr字段:需要序列化的属性列表。前者存在时返回前者,不存在时返回后者
    • _exclude与exclude_attr字段:不需要序列化的属性列表。前者存在时返回前者,不存在时返回后者
  • dump_all属性:表示是否序列化所有属性,为否则只序列化不以下划线开头的属性(优先级最低)
    • _dump_all字段:dump_all属性的底层字段。默认为default_dump_all
    • default_dump_all:默认情况下是否序列化所有属性。默认为否

该类提供以下字段/方法用于选择序列化后端:

  • pickle_backend字段:序列化后端名称。目前可为pickledill
  • get_backend方法:类方法,获取当前序列化后端

此外,该类实现了以下方法供序列化后端调用,以完成实际的序列化/反序列化工作:

  • __getstate__:获取所有需要序列化的属性
  • __setstate__:设置所有需要反序列化的属性