MST

星途 面试题库

面试题:Python类序列化与反序列化之高级题

在分布式系统中,需要对Python类进行跨平台的序列化与反序列化,要求选择合适的模块(除pickle外)来实现。自定义一个包含继承关系的类体系,父类有通用属性和方法,子类有特有的属性和方法,对该类体系进行序列化和反序列化,确保反序列化后对象的方法和属性都能正常使用。请阐述实现思路并写出关键代码。
10.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 选择模块:可使用dill模块,它是pickle的扩展,能处理更多类型的对象,包括跨平台的序列化与反序列化,且对类体系的支持较好。
  2. 定义类体系:创建具有继承关系的父类和子类,父类包含通用属性和方法,子类继承父类并添加特有属性和方法。
  3. 序列化:使用dilldump方法将对象序列化到文件或字节流。
  4. 反序列化:使用dillload方法从文件或字节流中反序列化出对象,并确保反序列化后的对象其方法和属性都能正常使用。

关键代码

import dill


# 定义父类
class ParentClass:
    def __init__(self, common_attr):
        self.common_attr = common_attr

    def common_method(self):
        print(f"这是父类的通用方法,通用属性为: {self.common_attr}")


# 定义子类
class ChildClass(ParentClass):
    def __init__(self, common_attr, unique_attr):
        super().__init__(common_attr)
        self.unique_attr = unique_attr

    def unique_method(self):
        print(f"这是子类的特有方法,特有属性为: {self.unique_attr}")


# 创建子类对象
child_obj = ChildClass("通用值", "特有值")

# 序列化对象
with open('serialized.pkl', 'wb') as f:
    dill.dump(child_obj, f)

# 反序列化对象
with open('serialized.pkl', 'rb') as f:
    deserialized_obj = dill.load(f)

# 调用反序列化对象的方法
deserialized_obj.common_method()
deserialized_obj.unique_method()