---什么是序列化(picking)?html
咱们把变量从内存中变成可存储或传输的过程称之为序列化。python
序列化以后,就能够把序列化后的内容写入磁盘,或者经过网络传输到别的机器上。编程
反过来,把变量内容从序列化的对象从新读到内存里称之为反序列化,即unpickling。json
举例:你们应该都玩过魔兽争霸,应该知道该游戏有一个存档的功能,我每次不想玩得时候就能够存档,而后再玩得时候咱们根本不须要从新开始玩,只须要读档就能够了。咱们如今学习的事面向对象的思想,那么在咱们眼中不论是咱们的游戏角色仍是游戏中的怪物、装备等等均可以当作是 一个个的对象,进行简单的分析。网络
---如何序列化?编程语言
在python中提供了两个模块可进行序列化。分别是pickle和json。ide
pickle函数
pickle是python中独有的序列化模块,所谓独有,就是指不能和其余编程语言的序列化进行交互,由于pickle将数据对象转化为bytes
post
>>> import pickle >>> d=[1,2,3,4] >>> pickle.dumps(d) b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.' >>> type(pickle.dumps(d)) <class 'bytes'> #类型为bytes
pickle模块提供了四个功能:dumps、dump、loads、load。学习
dumps和dump都是进行序列化,而loads和load则是反序列化。
>>> import pickle >>> d=[1,2,3,4] >>> pickle.dumps(d) b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.'
dumps将所传入的变量的值序列化为一个bytes,而后,就能够将这个bytes写入磁盘或者进行传输。
而dump则更加一步到位,在dump中能够传入两个参数,一个为须要序列化的变量,另外一个为须要写入的文件。
f=open('file_test','wb') >>> d=[1,2,3,4] >>> pickle.dump(d,f) >>> f.close() >>> f=opem('file_test','rb') f=open('file_test','rb') >>> f.read() b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.'
loads当咱们要把对象从磁盘读到内存时,能够先把内容读到一个bytes,而后用loads方法反序列化出对象,也能够直接用load方法直接反序列化一个文件。
>>> d=[1,2,3,4] >>> r=pickle.dumps(d) >>> print(r) b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.' >>> pickle.loads(r) [1, 2, 3, 4]
>>> d=[1,2,3,4] >>> f=open('file_test','wb') >>> pickle.dump(d,f) >>> f.close() >>> f=open('file_test','rb') >>> r=pickle.load(f) >>> f.close() >>> print(r) [1, 2, 3, 4]
json
若是咱们要在不一样的编程语言之间传递对象,就必须把对象序列化为标准格式,好比XML,但更好的方法是序列化为JSON,由于JSON表示出来就是一个字符串,能够被全部语言读取,也能够方便地存储到磁盘或者经过网络传输。JSON不只是标准格式,而且比XML更快,并且能够直接在Web页面中读取,很是方便。
若是想要详细了解JSON的话,推荐一篇博文:http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html
json中的方法和pickle中差很少,也是dumps,dump,loads,load。使用上也没有什么区别,区别在于,json中的序列化后格式为字符。
>>> import json >>> d=[1,2,3,4] >>> json.dumps(d) '[1, 2, 3, 4]' >>> type(json.dumps(d)) <class 'str'> #类型为str
由于python中一切事物皆对象,全部对象都是基于类建立的,因此,‘类’在python中占据了至关大的比重。咱们可否将类的实例进行序列化呢?
>>> class student(object): ... def __init__(self,name,age,course): ... self.name=name ... self.age=age ... self.course=course ... >>> a=student('linghuchong',24,'xixingdafa') >>> import json >>> json.dumps(a) TypeError: <student object at 0x035B8230> is not JSON serializable
晕,居然不能!如今几乎都是面向对象编程,类这么重要,居然不能序列化,怎么搞?
不要着急,前面的代码之因此没法把student类实例序列化为JSON,是由于默认状况下,dumps方法不知道如何将student实例变为一个JSON的'{}'对象。
咱们须要’告诉‘json模块如何转换。
>>> def st_to_dict(a): ... return {'name':a.name,'age':a.age,'course':a.course} ... >>> print(json.dumps(a,default=st_to_dict)) #default参数就是告知json如何进行序列化 {"course": "xixingdafa", "name": "linghuchong", "age": 24}
固然,若是咱们每定义一个类,还得再定义一下这个类的实例转换为字典的函数实在是太麻烦了!!咱们有一个一劳永逸的办法。
print(json.dumps(a, default=lambda obj: obj.__dict__))
其中的__dict__不需咱们在类中定义,由于一般class的实例都有一个__dict__属性,它就是一个字典,用来存储实例变量。
>>> print(a.__dict__) {'course': 'xixingdafa', 'age': 24, 'name': 'linghuchong'}