1. pickle、cPickle方法
1.1 pickle简介
pickle和cPickle模块是Python提供的用来序列化和反序列化的模块,可以将Python的数据结构转化为字节流(byte stream),其中cPickle是pickle的C语言实现,因此运行速度上会比pickle运行的快的多。但cPickle并不支持类Pickler() and Unpickler()的子类,不过平常使用中很少会用到这功能,因此pickle和cPickle差别不大,并且cPickle可以提供更快的运行速度。
pickle序列化后的字节流类型是python特有的,因此不可以被其他语言的反序列化;同样也不能反序列化其他语言序列化后的东西
pickle的data stream现在有三种格式:
Protocol version 0 | 序列化后为ASCII格式,兼容以前的格式 |
Protocol version 1 | 序列化后为二进制,兼容以前的格式 |
Protocol version 2 | 序列化后为二进制,提供了对Python新式类更有效的序列化 |
如果没有指定protocol,则会默认使用protocol 0。如果protocol被指定为小于0的或者HIGHEST_PROTOCOL,则会使用当前可用的最高版本。建议使用二进制的格式,可以通过指定protocl>0来选择
并不是所有的类型都支持序列化的,以下的类型是支持序列化的:
- 所有Python支持的 原生类型 : 布尔, 整数, 浮点数, 复数, 字符串, bytes(字节串)对象, 字节数组, 以及 None.
- 由任何原生类型组成的列表,元组,字典和集合。
- 由任何原生类型组成的列表,元组,字典和集合组成的列表,元组,字典和集合(可以一直嵌套下去,直至Python支持的最大递归层数).
- 函数,类,和类的实例(带警告)。
1.2 pickle使用方法
为了序列化一个object hierarchy,你必须先创建一个pickler,可以通过pickle.dump()来实现;同样要想反序列化,你也必须先创建一个unpickler,可以通过pickle.load()来实现
pickle.HIGHEST_PROTOCOL
可以获得可用的最高版本,这个返回值可以作为protocol。
pickle.dump(obj,file[,protoc