聊聊pickle,序列化对象的神器
2021/12/24 23:37:32
本文主要是介绍聊聊pickle,序列化对象的神器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
工作中经常需要对一些数据进行传输,在Python中,万物皆对象,也就是说,需要对一些对象在网络中进行传输,必须要转换成为可以传输的字节码。
一般我都喜欢用一个中间缓存来保存一些数据对象,用的最多的是redis。对于常规的Python内置对象,用json数据解码成字节码,很是方便,调试中可以直接从缓存中进行查看。
假如用了pickle,这些数据都是转换了以后都是一些人类无法理解的字节码。
话说这次操作的是一个collection中的OrderedDict对象,我在将该类对象保存到缓存的时候,一般习惯用repr强制转换成字符结构,解码放入缓存,后续通过eval提取出数据对象。
a Out[25]: OrderedDict([('a', 1)]) repr(a) Out[26]: "OrderedDict([('a', 1)])"
就想上面显示的,当我在另外一个进程通过eval执行该字符串时,其实就是执行OrderedDict([('a', 1)])的表达式,这个时候OrderedDict是一个可调用对象,接入该进程中没有导入该对象,就会报错。
但经过我的测试,pickle就显的很强大,当你传输一个对象无论是Python内置的,还是三方导入的,当你传入一个pickle数据给另外一个数据时,他在还原实例的时候,随便帮你导入,需要的可调用对象。
简单的比方好了
import requests a = requests.Session()
这个requests是一个三方的包,a是一个实例对象,需要Session的可调用对象创建,当pickle.dumps完成以后,就变成了一串字节码。
当另外一个进程通过pickle.loads还原该对象的时候,你不需要手动前置导入import requests,在还原对象的过程中会自动帮你导入。
这个对于传输一些标准的Python内置对象与三方实例还是非常好用的。但自定义的实例肯定是不可以的。
总结来说,序列化传输还是根据实际的情况来使用最好,标准的数据用json最好,特殊一些的用repr与eval搭配也可行,如果不需要中间缓存看数据内容,pickle肯定是最佳方案。
最后再强调一次,任何对象序列化与反序列化之后,对象的内容是相等的,但对象已经不是原来的他,因为一个是另一个的拷贝,是在计算机两块不同的内存中,无论是否经过通信传输。
这篇关于聊聊pickle,序列化对象的神器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-09CMS内容管理系统是什么?如何选择适合你的平台?
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)