(1)json模块
json模块的dumps和dump方法可以将python字典转为符合json数据格式要求的字符串数据,而loads() load()方法可以将json字符串数据转为python字典数据类型
(2)pickle模块(cPickle模块)
pickle模块是纯Python代码书写,cPickle模块则由C语言编写,cPickle模块的速度要比pickle快,故一般我们会使用cPickle模块。
try:
import cPickle as pickle
except ImportError:
import pickle
一般import cPickle模块使用上述代码
pickle模块的dumps和dump方法可以用于将类对象、实例对象、函数对象(毕竟python中一切皆对象)序列化存储,以实例对象为例,实例对象序列化后再多次反序列化后会生成多个不同id值的实例对象;模块的loads和load方法则是将序列化的对象反序列化。
python对象序列后的结果是一python的str类型数据。
(3)struct模块
struct模块的pack和upack方法可以按照特定格式编码和解析二进制数据。特别是在网络传输中和主机的小端子节序和大端子节序。
一个struct和pickle模块配合使用的例子是,我们将一个对象序列化后以网络进行传输,因为通过一次网络连接可以传输多个序列化对象,但是由于tcp字节流是无边界的字节流,故要表明各个传输来的序列化子节序的长度,故我们可以将序列化对象长度作为所要传递失望序列化对象的前缀进行传输。长度值我们可以先试用pack进行编码,接收端试用upack解码,然后依照此长度进行读取。
实例代码如下:
def makePickle(self, record):
"""
Pickles the record in binary format with a length prefix, and
returns it ready for transmission across the socket.
"""
ei = record.exc_info
if ei:
# just to get traceback text into record.exc_text ...
dummy = self.format(record)
record.exc_info = None # to avoid Unpickleable error
# See issue #14436: If msg or args are objects, they may not be
# available on the receiving end. So we convert the msg % args
# to a string, save it as msg and zap the args.
d = dict(record.__dict__)
d['msg'] = record.getMessage()
d['args'] = None
s = cPickle.dumps(d, 1)
if ei:
record.exc_info = ei # for next handler
slen = struct.pack(">L", len(s))
return slen + s