模块pickle实现了对一个Python对象结构的二进制序列化和反序列化。pickling是将Python对象机器所拥有的层次结构转化为一个字节流的过程。而unpickling是相反的操作,会将字节流转化回一个对象层次结构。

与Json模块的比较

Pickle协议和JSON(JavaScript Object Notation)间有着本质的不同

  • JSON 是一个文本序列化格式(它输出 unicode 文本,尽管在大多数时候它会接着以 utf-8 编码),而 pickle 是一个二进制序列化格式;
  • JSON 是我们可以直观阅读的,而 pickle 不是;
  • JSON是可互操作的,在Python系统之外广泛使用,而pickle则是Python专用的;
  • 默认情况下,JSON 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型
  • 不像pickle,对一个不信任的JSON进行反序列化的操作本身不会造成任意代码执行漏洞


数据流格式

pickle所使用的数据格式仅可用于Python。这样做的好处是没有外部标准给该格式强加限制,比如JSON或XDR标准。这也意味着非Python程序可能无法重新读取pickle封存的Python对象。
注解:序列化是一种比持久化更底层的概念,虽然 pickle 读取和写入的是文件对象,但它不处理持久对象的命名问题,也不处理对持久对象的并发访问(甚至更复杂)的问题。pickle 模块可以将复杂对象转换为字节流,也可以将字节流转换为具有相同内部结构的对象。处理这些字节流最常见的做法是将它们写入文件,但它们也可以通过网络发送或存储在数据库中。shelve 模块提供了一个简单的接口,用于在 DBM 类型的数据库文件上封存和解封对象。

模块接口

pickle.dump(obj, file, protocol=None, *,fix_imports=True, buffer_callback=None)
将对象obj封存以后的对象作为bytes类型直接返回,而不是将其写入到文件。

pickle.dumps(obj, file, protocol=None, *,fix_imports=True, buffer_callback=None)
将obj封存以后的对象作为bytes类型直接返回,而不是将其写入到文件。

参考资料

https://docs.python.org/zh-cn/3/library/pickle.html