

新闻资讯
行业动态Python对象序列化有明确边界:json仅支持基本类型且安全通用,pickle功能强但限于Python环境且有安全风险;含文件句柄、线程锁等对象不可直接序列化;应依场景选方案,避免越界误用。
Python对象序列化不是万能的,它有明确的适用边界和典型场景。用对地方能大幅提升开发效率,用错地方反而引发安全、性能或兼容性问题。
Python内置类型(如字典、列表、字符串、数字、None)和简单自定义类实例(不含可调用属性、文件句柄、线程锁等)通常可被pickle或json处理。
lambda、open()返回的文件对象、threading.Lock、数据库连接等,基本无法直接序列化不同场景需匹配不
同序列化方式,不能一概而用:
json(安全、通用、人可读),比如Flask API返回值、HTTP请求体pickle(保留类型和方法),比如joblib缓存训练好的sklearn模型json或toml(结构清晰、易编辑),避免用pickle——防止配置文件被恶意篡改触发代码执行msgpack或protobuf(体积小、解析快),比json更高效,比pickle更安全忽视序列化边界容易导致运行时错误或隐患:
立即学习“Python免费学习笔记(深入)”;
json.dumps()序列化datetime对象 → 报TypeError;需预处理(如转为ISO字符串)或用default参数定制pickle保存带闭包或局部函数的对象 → 反序列化失败,因依赖的命名空间不可见pickle.load() → 攻击者可构造恶意字节流,执行任意系统命令当对象本身难以序列化时,优先考虑“传描述,不传实体”:
{"path": "data.parquet", "columns": ["a","b"]}){"class": "MyModel", "params": {"lr": 0.01}}),用工厂函数重建__getstate__/__setstate__方法,显式控制哪些字段参与pickle,排除不可序列化部分序列化是工具,不是目的。判断一个对象要不要、能不能、该用哪种方式序列化,关键看它要流向哪里、由谁还原、是否可信、是否长期存储。清楚边界,才能用得稳、用得准。