序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上,把变量内容从序列化的对象重新读到内存里称之为反序列化。
比较通用的标准化的有json和xml格式,可以在不同的语言之间和系统之间传递对象,python也有内置的Pickle,该格式只能用于python内部,不同的版本之间都有可能不兼容。
Python提供两个模块来实现序列化:cPickle和pickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的。
通过调用pickle的dumps方法,可以将把任意对象序列化成一个str,通过调用loads方法可以将str序列化成对象,dump可以直接将对象序列化写入文件中,load直接将文件中的内容反序列化成对象。
如下所示:
#dict对象
MyMsg = dict(name='ctx',age='50',add='shanghai')
#序列化成字符串 str = pickle.dumps(MyMsg) print str
#直接写入文件 file = open("serialize.pickle",'wb') pickle.dump(MyMsg,file) file.close() #直接将文件内容反序列化成对象 file = open("serialize.pickle",'rb') d = pickle.load(file) file.close() print d
结果如下所示:
dp1
S'add'
p2
S'shanghai'
p3
sS'age'
p4
S'50'
p5
sS'name'
p6
S'ctx'
p7
s.
{'add':'shanghai', 'age': '50', 'name': 'ctx'}
生成文件serialize.pickle,其文本内容显示与str结果一致。
Json的序列化和反序列化的格式与pickle相似,通过调用dump和load方法来完成。
分别对dict、int、str和float变量序列化为json,如下所示
import json MyMsg = dict(name='ctx',age='50',add='shanghai') list = [10,15,16,17] ID = 10 HardStr = "No" PI = 3.1415 jsonStr = json.dumps(MyMsg) print "my msg json str:"+json.dumps(MyMsg) print "list json str:"+json.dumps(list)
print "HartStr json str:"+json.dumps(HardStr) print "ID json str:"+json.dumps(ID) print "PI json str:"+json.dumps(PI)
则结果如下:
my msg json str:{"add":"shanghai", "age": "50", "name":"ctx"}
list json str[10, 15, 16, 17]
ID json str:10
HartStr json str:"No"
PI json str:3.1415
同pickle,dump可以将序列化结果输入到文件中
Loads可以将json格式的字符串反序列化生成对象
Load可以将json格式的文件中的内容反序列化生成对象
例如编写一下json格式的config文件
{ "work path":"/root", "complile":"clang++", "file":"elf", "count":100 }
反序列化操作如下:
file = open("config",'rb') readOb= json.load(file) print readOb
结果如下:
{u'count': 100, u'work path': u'/root',u'file': u'elf', u'complile': u'clang++'}
Json中表示的数据类型与python变量类型对应如下,在一些场合下可以将其写成配置文件写成json格式配置文件比较清晰和方便。
JSON类型 |
Python类型 |
{} |
dict |
[] |
list |
"string" |
'str'或u'unicode' |
1234.56 |
int或float |
true/false |
True/False |
null |
None |